通过R中的循环向data.frame添加新列

时间:2016-04-29 20:21:14

标签: r dataframe

我有n个data.frame我想将列添加到所有data.frame

a <- data.frame(1:4,5:8) 
b <- data.frame(1:4, 5:8)
test=ls()

for (j in test){
  j = cbind(get(j),IssueType=j)
}

我遇到的问题是

j = cbind(get(j),IssueType=j)

因为它会将所有数据分配到j而不是ab

3 个答案:

答案 0 :(得分:3)

如评论所述,最好将相关数据保存在列表结构中。如果您已在全局环境中拥有data.frames并且希望将它们放入列表中,则可以使用:

dflist <- Filter(is.data.frame, as.list(.GlobalEnv))

这来自here,并确保您只从全局环境中获取data.frame个对象。

您会注意到您现在已经有了一个命名列表:

> dflist
# $a
#   X1.4 X5.8
# 1    1    5
# 2    2    6
# 3    3    7
# 4    4    8
# 
# $b
#   X1.4 X5.8
# 1    1    5
# 2    2    6
# 3    3    7
# 4    4    8

因此,您可以通过键入

轻松选择所需的数据
dflist[["a"]]

如果您仍想创建额外的列,可以这样做:

dflist <- Map(function(df, x) {df$IssueType <- x; df}, dflist, names(dflist))

现在,dflist中的每个data.frame都有一个名为IssueType的新列:

> dflist
# $a
#   X1.4 X5.8 IssueType
# 1    1    5         a
# 2    2    6         a
# 3    3    7         a
# 4    4    8         a
# 
# $b
#   X1.4 X5.8 IssueType
# 1    1    5         b
# 2    2    6         b
# 3    3    7         b
# 4    4    8         b

将来,您可以从头开始在列表中创建数据,即

dflist <- list(
  a = data.frame(1:4,5:8) 
  b = data.frame(1:4, 5:8)
)

答案 1 :(得分:0)

要创建data.frames列表,请执行以下操作:

  

a&lt; - data.frame(1:4,5:8); b&lt; - data.frame(1:4,5:8); test&lt; - list(a,b)

这使您可以使用lapply函数来执行您喜欢的每个数据帧,例如:

out <- lapply(test, function(x) cbind(j))

对于大多数data.frame操作,我建议使用软件包dplyr和tidyr。

答案 2 :(得分:0)

wooo wooo

这是问题的答案 由@docendo discimus帮助

创建数据框

  

a&lt; - data.frame(1:4,5:8)   b&lt; - data.frame(1:4,5:8)

将data.frame分组到列表中

  

dflist&lt; - 过滤器(is.data.frame,as.list(.GlobalEnv))

添加额外列

  

dflist&lt; - Map(function(df,x){df $ IssueType&lt; - x; df},dflist,names(dflist))

取消数据框架

  

list2env(dflist,.GlobalEnv)