我正在尝试使用R中的for循环从几个文件中编译数据。我想将所有数据放入一个表中。以下计算只是一个例子。
library(reshape)
dat1 <- data.frame("Specimen" = paste("sp", 1:10, sep=""), "Density_1" = rnorm(10,4,2), "Density_2" = rnorm(10,4,2), "Density_3" = rnorm(10,4,2))
dat2 <- data.frame("Specimen" = paste("fg", 1:10, sep=""), "Density_1" = rnorm(10,4,2), "Density_2" = rnorm(10,4,2))
dat <- c("dat1", "dat2")
for(i in 1:length(dat)){
data <- get(dat[i])
melt.data <- melt(data, id = 1)
assign(paste(dat[i], "tbl", sep=""), cast(melt.data, ~ variable, mean))
}
rbind(dat1tbl, dat2tbl)
在dat2中添加额外列的最流畅的方法是什么?我想获得相同的列名(在这种情况下为“Density_3”)并填充零,如果它尚不存在。假设我有大约100个表,列数(Density_1,2,3等)在5到6之间变化。
我试过了,但它不起作用:
if(names(data) %in% "Density_3" == FALSE){
dat.all$Density_3 <- 0
} else {
dat.all$Density_3 <- dat.all$Density3}
另一个问题:rbind()表是否有顺畅的方法?似乎rbind(get(dat))不起作用。
答案 0 :(得分:3)
在盯着这个问题一段时间之后,我认为它的意图可能被不必要的get
和assign
操纵所掩盖。我认为答案是pylr::rbind.fill
我会构造“dat”,而不是作为字符向量而是作为两个数据帧的列表,使用aggregate( ..., FUN=mean)
(因为我没有使用reshape2 / plyr总线,除了{{1}在结果列表中,然后melt
然后rbind.fill
。无论如何,这是我认为你想要的。我不认为用零添加真正缺少的值是个好主意。
do.call(rbind.fill, ...)