我正在尝试使用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))不起作用。

最佳答案

盯着这个问题一段时间后,我认为它的意图可能已被不必要的getassign操作所掩盖。我认为答案是pylr::rbind.fill
我本来会使用aggregate( ..., FUN=mean)而不是字符向量而是两个数据帧的列表来构造“dat”(使用melt(因为除了rbind.filldo.call(rbind.fill, ...)之外,我还没有进入reshape2/plyr总线),然后在结果列表。无论如何,这就是我想要的。我认为对于真正缺失的值添加零不是一个好主意。

> rbind.fill(dat1tbl, dat2tbl)
  value Density_1 Density_2 Density_3
1 (all)  5.006709  4.088988  2.958971
2 (all)  4.178586  3.812362        NA

关于R循环: Adding a column to a table if does not already exist,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7121908/

10-11 19:58