3 回答

TA貢獻(xiàn)1886條經(jīng)驗 獲得超2個贊
在plyr包中,有一個函數(shù)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貢獻(xiàn)1865條經(jīng)驗 獲得超7個贊
鑒于后續(xù)評論,我尚不清楚OP實際執(zhí)行的操作。他們實際上可能正在尋找一種將數(shù)據(jù)寫入文件的方法。
但是,讓我們假設(shè)我們確實是在尋找cbind一種不同長度的多個數(shù)據(jù)幀的方法。
cbind最終會致電data.frame,其幫助文件中顯示:
傳遞給data.frame的對象應(yīng)該具有相同的行數(shù),但是,如果有必要,我保護(hù)的原子向量,因子和字符向量將被回收多次(包括從R 2.9.0版開始,包括列表參數(shù)的元素)。
因此在OP的實際示例中,應(yīng)該不會有錯誤,因為R應(yīng)該將較短的向量回收為長度為50的。確實,當(dāng)我運行以下命令時:
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)
我沒有任何錯誤,較短的數(shù)據(jù)幀也按預(yù)期回收。但是,當(dāng)我運行此命令時:
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的奇妙之處在于,即使您不希望這樣做,也可以使它幾乎可以做任何您想做的事情。例如,這是一個簡單的函數(shù),它將cbind對長度不均勻的數(shù)據(jù)幀進(jìn)行數(shù)據(jù)處理,并使用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)
我不能保證此功能在所有情況下都有效。它僅作為示例。
編輯
如果主要目標(biāo)是創(chuàng)建一個csv或文本文件,那么您要做的所有事情都會將功能更改為pad ""而不是NA,然后執(zhí)行以下操作:
dat <- cbindPad(dat1,dat2,dat3)
rs <- as.data.frame(apply(dat,1,function(x){paste(as.character(x),collapse=",")}))
然后write.table在上使用rs。

TA貢獻(xiàn)1860條經(jīng)驗 獲得超9個贊
我的想法是獲取所有data.frames的最大行數(shù),然后根據(jù)需要將空矩陣追加到每個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 關(guān)注
- 899 瀏覽
添加回答
舉報