【问题标题】:R loops: Adding a column to a table if does not already existR循环:如果不存在,则将列添加到表中
【发布时间】:2011-10-30 14:48:59
【问题描述】:

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

【问题讨论】:

    标签: r loops if-statement plyr


    【解决方案1】:

    在盯着这个问题看了一会儿之后,我认为它的意图可能被不必要的getassign 操作所掩盖。我认为答案是pylr::rbind.fill

    我会构造“dat”,而不是作为字符向量,而是作为两个数据帧的列表,使用 aggregate( ..., FUN=mean)(因为我没有上 reshape2/plyr 总线,除了 melt 和 @987654326 @ 即 ),然后在结果列表中出现 do.call(rbind.fill, ...)。无论如何,这就是我认为你想要的。我认为为真正缺失的值添加零不是一个好主意。

    > 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
    

    【讨论】:

    • 不知道 rbind.fill() 命令。那就是我一直在寻找的那个。谢谢!
    猜你喜欢
    • 2010-11-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-21
    • 2019-09-22
    • 2018-02-02
    • 2019-03-12
    • 2020-08-12
    相关资源
    最近更新 更多