R:动态地将列添加到数据框中

时间:2014-11-22 01:23:29

标签: r loops dataframe on-the-fly

R的新作和此处的一般编程。我有几个物种(列)和图(行)的存在/不存在数据的二元矩阵。我试图在几个相异指数中使用它们,这要求它们都具有相同的尺寸。尽管总共存在10个图,但是根据在该特定时间观察到的物种,存在可变数量的列。我尝试添加“失踪”'每个矩阵的列,以便我可以执行分析如下:

df1 <- read.csv('file1.csv', header=TRUE)
df2 <- read.csv('file2.csv', header=TRUE)

newCol <- unique(append(colnames(df1),colnames(df2)))
diff1 <- setdiff(newCol,colnames(df1))
diff2 <- setdiff(newCol,colnames(df2))

for (i in 1:length(diff1)) {
  df1[paste(diff1[i])]
}
for (i in 1:length(diff2)) {
  df2[paste(diff2[i])]
}

不会抛出任何错误,但df1和df2都保持不变。我怀疑我的问题是我使用了粘贴,但我无法找到任何其他方法来像这样在数据框中添加列。添加后,新列的矩阵也应该为0,但我认为这是默认值,所以我没有添加任何内容来指定它。

谢谢大家。

1 个答案:

答案 0 :(得分:2)

使用您的代码,您可以通过以下方式生成没有for循环的列:

df1[, diff1] <- 0 #I guess you want `0` to fill those columns
df2[, diff2] <- 0

identical(sort(colnames(df1)), sort(colnames(df2)))
#[1] TRUE

或者,如果您想将数据集合并为一个,则可以使用rbind_list中的data.table fill=TRUE

library(data.table)
rbindlist(list(df1, df2), fill=TRUE)

数据

 set.seed(22)
 df1 <- as.data.frame(matrix(sample(0:1, 10*6, replace=TRUE), ncol=6,
  dimnames=list(NULL, sample(paste0("Species", 1:10), 6, replace=FALSE))))


 set.seed(35)
 df2 <- as.data.frame(matrix(sample(0:1, 10*8, replace=TRUE), ncol=8,
  dimnames=list(NULL, sample(paste0("Species", 1:10),8 , replace=FALSE))))