我有两个数据帧.
第一列只有一列10行.
第二个是3列50行.
当我尝试通过使用来组合cbind
它时,它会给出以下错误:
data.frame(...,check.names = FALSE)出错:
任何人都可以建议另一个功能吗?
PS我也尝试使用列表,但它给出了同样的错误.
由3列组成的数据框应该是CSV文件中的前3列,而当我使用该write.table
函数写入时,具有一列的数据框应该是该文件中的第四列.前3列有50行,第4列应占前10行.
And*_*rie 34
在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
Run Code Online (Sandbox Code Playgroud)
jor*_*ran 21
根据后续评论,我根本不清楚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)
Run Code Online (Sandbox Code Playgroud)
我没有错误,更短的数据框按预期回收.但是,当我运行这个时:
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)
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
Error in data.frame(..., check.names = FALSE) :
arguments imply differing number of rows: 50, 9
Run Code Online (Sandbox Code Playgroud)
但关于R的奇妙之处在于,即使你不应该,你也可以做任何你想做的事情.例如,这是一个简单的函数,它将cbind
对不均匀长度的数据帧进行数据处理,并使用NA
s 自动填充较短的帧:
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))
}
Run Code Online (Sandbox Code Playgroud)
可以像这样使用:
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)
Run Code Online (Sandbox Code Playgroud)
我不保证这个功能适用于所有情况; 它只是一个例子.
编辑
如果主要目标是创建一个csv或文本文件,那么你需要做的就是改变函数来填充""
而不是NA
然后做这样的事情:
dat <- cbindPad(dat1,dat2,dat3)
rs <- as.data.frame(apply(dat,1,function(x){paste(as.character(x),collapse=",")}))
Run Code Online (Sandbox Code Playgroud)
然后使用write.table
上rs
.
归档时间: |
|
查看次数: |
102281 次 |
最近记录: |