3 回答

TA貢獻1886條經驗 獲得超2個贊
在plyr包中,有一個函數rbind.fill將合并data.frames并NA為空單元格引入:
library(plyr)
combined <- rbind.fill(mtcars[c("mpg", "wt")], mtcars[c("wt", "cyl")])
combined[25:40, ]
mpg wt cyl
25 19.2 3.845 NA
26 27.3 1.935 NA
27 26.0 2.140 NA
28 30.4 1.513 NA
29 15.8 3.170 NA
30 19.7 2.770 NA
31 15.0 3.570 NA
32 21.4 2.780 NA
33 NA 2.620 6
34 NA 2.875 6
35 NA 2.320 4

TA貢獻1865條經驗 獲得超7個贊
鑒于后續評論,我尚不清楚OP實際執行的操作。他們實際上可能正在尋找一種將數據寫入文件的方法。
但是,讓我們假設我們確實是在尋找cbind一種不同長度的多個數據幀的方法。
cbind最終會致電data.frame,其幫助文件中顯示:
傳遞給data.frame的對象應該具有相同的行數,但是,如果有必要,我保護的原子向量,因子和字符向量將被回收多次(包括從R 2.9.0版開始,包括列表參數的元素)。
因此在OP的實際示例中,應該不會有錯誤,因為R應該將較短的向量回收為長度為50的。確實,當我運行以下命令時:
set.seed(1)
a <- runif(50)
b <- 1:50
c <- rep(LETTERS[1:5],length.out = 50)
dat1 <- data.frame(a,b,c)
dat2 <- data.frame(d = runif(10),e = runif(10))
cbind(dat1,dat2)
我沒有任何錯誤,較短的數據幀也按預期回收。但是,當我運行此命令時:
set.seed(1)
a <- runif(50)
b <- 1:50
c <- rep(LETTERS[1:5],length.out = 50)
dat1 <- data.frame(a,b,c)
dat2 <- data.frame(d = runif(9), e = runif(9))
cbind(dat1,dat2)
我收到以下錯誤:
Error in data.frame(..., check.names = FALSE) :
arguments imply differing number of rows: 50, 9
但是R的奇妙之處在于,即使您不希望這樣做,也可以使它幾乎可以做任何您想做的事情。例如,這是一個簡單的函數,它將cbind對長度不均勻的數據幀進行數據處理,并使用NAs 自動填充較短的幀:
cbindPad <- function(...){
args <- list(...)
n <- sapply(args,nrow)
mx <- max(n)
pad <- function(x, mx){
if (nrow(x) < mx){
nms <- colnames(x)
padTemp <- matrix(NA, mx - nrow(x), ncol(x))
colnames(padTemp) <- nms
if (ncol(x)==0) {
return(padTemp)
} else {
return(rbind(x,padTemp))
}
}
else{
return(x)
}
}
rs <- lapply(args,pad,mx)
return(do.call(cbind,rs))
}
可以這樣使用:
set.seed(1)
a <- runif(50)
b <- 1:50
c <- rep(LETTERS[1:5],length.out = 50)
dat1 <- data.frame(a,b,c)
dat2 <- data.frame(d = runif(10),e = runif(10))
dat3 <- data.frame(d = runif(9), e = runif(9))
cbindPad(dat1,dat2,dat3)
我不能保證此功能在所有情況下都有效。它僅作為示例。
編輯
如果主要目標是創建一個csv或文本文件,那么您要做的所有事情都會將功能更改為pad ""而不是NA,然后執行以下操作:
dat <- cbindPad(dat1,dat2,dat3)
rs <- as.data.frame(apply(dat,1,function(x){paste(as.character(x),collapse=",")}))
然后write.table在上使用rs。

TA貢獻1860條經驗 獲得超9個贊
我的想法是獲取所有data.frames的最大行數,然后根據需要將空矩陣追加到每個data.frame。此方法不需要其他程序包,僅使用base。代碼如下:
list.df <- list(data.frame(a = 1:10), data.frame(a = 1:5), data.frame(a = 1:3))
max.rows <- max(unlist(lapply(list.df, nrow), use.names = F))
list.df <- lapply(list.df, function(x) {
na.count <- max.rows - nrow(x)
if (na.count > 0L) {
na.dm <- matrix(NA, na.count, ncol(x))
colnames(na.dm) <- colnames(x)
rbind(x, na.dm)
} else {
x
}
})
do.call(cbind, list.df)
# a a a
# 1 1 1 1
# 2 2 2 2
# 3 3 3 3
# 4 4 4 NA
# 5 5 5 NA
# 6 6 NA NA
# 7 7 NA NA
# 8 8 NA NA
# 9 9 NA NA
# 10 10 NA NA
- 3 回答
- 0 關注
- 903 瀏覽
添加回答
舉報