3 回答

TA貢獻(xiàn)1886條經(jīng)驗(yàn) 獲得超2個(gè)贊
在plyr包中,有一個(gè)函數(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)驗(yàn) 獲得超7個(gè)贊
鑒于后續(xù)評(píng)論,我尚不清楚OP實(shí)際執(zhí)行的操作。他們實(shí)際上可能正在尋找一種將數(shù)據(jù)寫(xiě)入文件的方法。
但是,讓我們假設(shè)我們確實(shí)是在尋找cbind一種不同長(zhǎng)度的多個(gè)數(shù)據(jù)幀的方法。
cbind最終會(huì)致電data.frame,其幫助文件中顯示:
傳遞給data.frame的對(duì)象應(yīng)該具有相同的行數(shù),但是,如果有必要,我保護(hù)的原子向量,因子和字符向量將被回收多次(包括從R 2.9.0版開(kāi)始,包括列表參數(shù)的元素)。
因此在OP的實(shí)際示例中,應(yīng)該不會(huì)有錯(cuò)誤,因?yàn)镽應(yīng)該將較短的向量回收為長(zhǎng)度為50的。確實(shí),當(dāng)我運(yùn)行以下命令時(shí):
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)
我沒(méi)有任何錯(cuò)誤,較短的數(shù)據(jù)幀也按預(yù)期回收。但是,當(dāng)我運(yùn)行此命令時(shí):
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)
我收到以下錯(cuò)誤:
Error in data.frame(..., check.names = FALSE) :
arguments imply differing number of rows: 50, 9
但是R的奇妙之處在于,即使您不希望這樣做,也可以使它幾乎可以做任何您想做的事情。例如,這是一個(gè)簡(jiǎn)單的函數(shù),它將cbind對(duì)長(zhǎng)度不均勻的數(shù)據(jù)幀進(jìn)行數(shù)據(jù)處理,并使用NAs 自動(dòng)填充較短的幀:
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)建一個(gè)csv或文本文件,那么您要做的所有事情都會(huì)將功能更改為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)驗(yàn) 獲得超9個(gè)贊
我的想法是獲取所有data.frames的最大行數(shù),然后根據(jù)需要將空矩陣追加到每個(gè)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)注
- 939 瀏覽
添加回答
舉報(bào)