如何将列表中的元素转换为R中的数据帧

时间:2013-10-04 19:01:46

标签: r

我在R中遇到一些问题。我在R中有这个列表a1

> a1
[[1]]
  x1 x2 x3
1  1  1  1
2  2  2  2
3  2  2  2
4 13 13 13
5 12 12 12
6 23 23 23
7 12 12 12

[[2]]
  x1 x2 x3
1  2  2  2
2  2  2  2
3  2  2  2
4 13 13 13
5 12 12 12
6 23 23 23
7 12 12 12

[[3]]
  x1 x2 x3
1  3  3  3
2  2  2  2
3  2  2  2
4 13 13 13
5 12 12 12
6 23 23 23
7 12 12 12

我的问题是我无法将所有元素都提取为数据框。例如,我使用此代码将它们作为数据框提取,但我收到此错误:

for(i in c(1:3))
{
  paste("a",i)=as.data.frame(a1[i])
}
Error in paste("a", i) = as.data.frame(a1[i]) : 
  target of assignment expands to non-language object

我的问题是该列表有20个元素,当我放a1=as.data.frame(a1[1])它有效但我必须编写许多行,因为显示的for代码不起作用。谢谢你的帮助。

2 个答案:

答案 0 :(得分:1)

如果我正确理解了您的目标,请执行以下两个步骤:

  1. 为列表项添加名称。
  2. 使用list2env在工作区中创建对象。
  3. 以下是一个例子:

    mylist <- list(data.frame(matrix(1:4, ncol = 2)),
                   data.frame(matrix(5:8, ncol = 2)),
                   data.frame(matrix(9:12, ncol = 2)))
    names(mylist) <- LETTERS[seq_along(mylist)]
    mylist
    # $A
    #   X1 X2
    # 1  1  3
    # 2  2  4
    # 
    # $B
    #   X1 X2
    # 1  5  7
    # 2  6  8
    # 
    # $C
    #   X1 X2
    # 1  9 11
    # 2 10 12
    
    A
    # Error: object 'A' not found
    
    list2env(mylist, envir=.GlobalEnv)
    # <environment: R_GlobalEnv>
    
    A
    #   X1 X2
    # 1  1  3
    # 2  2  4
    

答案 1 :(得分:1)

您应该将元素保留在列表中,最好使用lapply来避免副作用。尝试类似这样的事情:

 lapply(a1,write.csv)

编辑添加flodel答案:

filenames <- paste0(seq_along(a1), ".csv")
mapply(write.csv, a1, file = filenames)