1

我在 R 中有一个小问题要解决。我a1在 R 中有这个列表:

> 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显示的代码不起作用。谢谢你的帮助。

4

2 回答 2

1

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

  1. 将名称添加到您的列表项。
  2. 使用 . 在您的工作区中创建对象list2env

这是一个例子:

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
于 2013-10-04T19:05:38.823 回答
1

你应该把你的元素放在一个列表中,更好地使用lapply以避免副作用。例如尝试这样的事情:

 lapply(a1,write.csv)

编辑添加弗洛德尔答案:

filenames <- paste0(seq_along(a1), ".csv")
mapply(write.csv, a1, file = filenames)
于 2013-10-04T19:15:12.087 回答