0

大家好,我正在使用 R 中的数据框列表,这很棒,但我遇到了一个小问题。我有下一个数据框列表。列表的真正扩展得到了 20 多个数据框,包含 1000 个观察值和 20 列。这里我把结构:

my.list

$a1
  alfa beta
1    1    2
2    1    3
3    1    4
4    1    5
5    1    6
6    1    7

$a2
   alfa beta
1     1    2
2     1    3
3     1    4
4     1    5
5     1    6
6     1    7
7     2    1
8     2    5
9     2    9
10    2   13
11    2   17
12    2   21
13    2   25
14    2   29
15    2   33

$a3
   alfa beta
1     1    2
2     1    3
3     1    4
4     1    5
5     1    6
6     1    7
7     2    1
8     2    5
9     2    9
10    2   13
11    2   17
12    2   21
13    2   25
14    2   29
15    2   33
16    3   11
17    3    2
18    3   -7
19    3  -16
20    3  -25

$a4
   alfa beta
1     1    2
2     1    3
3     1    4
4     1    5
5     1    6
6     1    7
7     2    1
8     2    5
9     2    9
10    2   13
11    2   17
12    2   21
13    2   25
14    2   29
15    2   33
16    3   11
17    3    2
18    3   -7
19    3  -16
20    3  -25
21    5    1
22    1    1
23    5    1

$a5
   alfa beta
1     2   13
2     2   17
3     2   21
4     2   25
5     2   29
6     2   33
7     3   11
8     3    2
9     3   -7
10    3  -16
11    3  -25
12    5    1
13    1    1
14    5    1

的元素在my.list哪里a1,a2,a3,a5,a5。我正在使用函数尝试在以下元素中创建类似的东西my.list

$a1
  alfa beta  a1
1    1    2  1
2    1    3  1
3    1    4  1
4    1    5  1
5    1    6  1
6    1    7  1

$a2
   alfa beta  a2
1     1    2  2
2     1    3  2
3     1    4  2
4     1    5  2
5     1    6  2
6     1    7  2
7     2    1  2
8     2    5  2
9     2    9  2
10    2   13  2
11    2   17  2
12    2   21  2
13    2   25  2
14    2   29  2
15    2   33  2

$a3
   alfa beta  a3
1     1    2  3
2     1    3  3
3     1    4  3
4     1    5  3
5     1    6  3
6     1    7  3
7     2    1  3
8     2    5  3
9     2    9  3
10    2   13  3
11    2   17  3
12    2   21  3
13    2   25  3
14    2   29  3
15    2   33  3
16    3   11  3
17    3    2  3
18    3   -7  3
19    3  -16  3
20    3  -25  3

$a4
   alfa beta  a4
1     1    2  4
2     1    3  4
3     1    4  4
4     1    5  4
5     1    6  4
6     1    7  4
7     2    1  4
8     2    5  4
9     2    9  4
10    2   13  4
11    2   17  4
12    2   21  4
13    2   25  4
14    2   29  4
15    2   33  4
16    3   11  4
17    3    2  4
18    3   -7  4
19    3  -16  4
20    3  -25  4
21    5    1  4
22    1    1  4
23    5    1  4

$a5
   alfa beta  a5
1     2   13  5
2     2   17  5
3     2   21  5
4     2   25  5
5     2   29  5
6     2   33  5
7     3   11  5
8     3    2  5
9     3   -7  5
10    3  -16  5
11    3  -25  5
12    5    1  5
13    1    1  5
14    5    1  5

我想计算my.list一个新变量中的每个数据框,其名称等于数据框的名称( ) ,a1,a2,a3,a4,a5其值等于数据框在my.list( 、、、、、)中的位置my.list[1]=a1,括号中的数字显示位置或数据框。我正在使用表单包,但功能不起作用。我等着有人可以帮我解决这个问题my.list[2]=a2my.list[3]=a3my.list[4]=a4my.list[5]=a5llplyplyr

4

5 回答 5

4
lapply(seq(my.list), function(x) "[[<-"(my.list[[x]], paste0("a", x), value = x))

会成功的。

功能"[[<-"(x, y, value = z)类似x[[y]] <- z但不修改x。而是返回修改后的版本。

于 2013-10-27T22:02:50.170 回答
1
ll <- list(a1 = data.frame(alfa = 1:3), a2 = data.frame(alfa = 1:3))

ll[] <- lapply(seq_along(ll), function(x){
  setnames(cbind(ll[[x]], x), c(names(ll[[x]]), names(ll)[x]))
  })

# $a1
#   alfa a1
# 1    1  1
# 2    2  1
# 3    3  1
# 
# $a2
#   alfa a2
# 1    1  2
# 2    2  2
# 3    3  2

mapply替代品更新

mapply(function(x, y){
  setNames(cbind(x, y),  c(names(ll[[y]]), names(ll)[y]))
},
       ll, seq_along(ll),
       SIMPLIFY = FALSE)

如果新变量的名称不是问题,mapply可以简化代码:

mapply(cbind, ll, a = seq_along(ll), SIMPLIFY = FALSE)
于 2013-10-27T21:38:47.977 回答
0

也许不是最优雅的解决方案,但这可以完成工作

counter=0
llply(my.list,function(x) {
  counter<<-counter+1
  tmp=data.frame(x,counter)
  colnames(tmp)[3]=paste0("a",counter)
  tmp
})
于 2013-10-27T21:25:36.337 回答
0

另一个不太优雅的解决方案,从

listofdf <- list(a1=data.frame(alfa=c(1,1), beta=c(2,3)), 
                 a2=data.frame(alfa=c(1,2), beta=c(2,5)),
                 a3=data.frame(alfa=c(1,1), beta=c(1,3)) )

然后

listofdfplus <- listofdf
for (i in 1:length(listofdf)){ listofdfplus[[i]]$extra <- i 
    names(listofdfplus[[i]]) <- c(names(listofdf[[i]]),names(listofdf)[i]) }

> listofdfplus
$a1
  alfa beta a1
1    1    2  1
2    1    3  1

$a2
  alfa beta a2
1    1    2  2
2    2    5  2

$a3
  alfa beta a3
1    1    1  3
2    1    3  3
于 2013-10-27T21:38:13.740 回答
0
kk <- list(a1 = data.frame(data1 = 4:9), a2 = data.frame(data2 = 1:6))
myvar<-as.list(names(kk))
myval<-as.list(1:length(kk))
jj<-Map(function(x,y,z) cbind(x,setNames(cbind(x,z)[2],y)),kk,myvar,myval)

  > jj
$a1
  data1 a1
1     4  1
2     5  1
3     6  1
4     7  1
5     8  1
6     9  1

$a2
  data2 a2
1     1  2
2     2  2
3     3  2
4     4  2
5     5  2
6     6  2
于 2013-10-27T22:20:42.680 回答