循环遍历各个数据框并添加新列

时间:2014-08-26 12:29:41

标签: r loops assign

我想循环遍历各个数据框(不在列表中)并为每个df附加一列,以便附加列是原始df中第一列的副本。

对于df x:

> x
  V1 V2 V3
1  1  2  3
2  1  2  3
3  1  2  2
4  1  2  2
5  1  1  1

所需的输出将是:

> x
  V1 V2 V3 newCol
1  1  2  3  1
2  1  2  3  1
3  1  2  2  1
4  1  2  2  1
5  1  1  1  1

我尝试使用这个循环:

filenames <- names(which(sapply(.GlobalEnv, is.data.frame)))
for(x in seq_along(filenames)){
  filenames[x]$newCol  <-   x[,1]
}

但发生错误:

  

x [,1]出错:维数不正确

2 个答案:

答案 0 :(得分:2)

像这样:

要变量文件名[x]赋值,即第一列的数据框:)

assign(filenames[x], data.frame(get(filenames[x]),get(filenames[x])[,1]))

答案 1 :(得分:1)

或者,你可以写

   for(i in seq_along(filenames)){
    assign(filenames[i], `[[<-`(get(filenames[i]),'newCol', 
                                value=get(filenames[i])[,1]))
   }

类似于以下内容:

   for(i in seq_along(filenames)) {
   x <- get(filenames[i])
   x$newCol <- x[, 1]
   assign(filenames[i], x)
  }

  x1
 #  V1 V2 V3 newCol
 #1  1  2  3      1
 #2  1  2  3      1
 #3  1  2  2      1
 #4  1  2  2      1
 #5  1  1  1      1

以上也可以写成:

数据

  x1 <- structure(list(V1 = c(1L, 1L, 1L, 1L, 1L), V2 = c(2L, 2L, 2L, 
  2L, 1L), V3 = c(3L, 3L, 2L, 2L, 1L)), .Names = c("V1", "V2", 
 "V3"), class = "data.frame", row.names = c("1", "2", "3", "4", 
  "5"))

  x2 <- x1

  filenames <- c("x1", "x2")
相关问题