0

こんにちは、私はRでデータフレームのリストを扱っています。それは素晴らしいですが、少し問題があります。次のデータ フレームのリストがあります。リストを実際に拡張すると、1000 個の観測値と 20 列を含む 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]=a1my.list[2]=a2my.list[3]=a3、)内のデータ フレームの位置に等しい新しい変数の各データ フレームを計算したいmy.list[4]=a4my.list[5]=a5位置またはデータ フレーム。llplyformパッケージを使用してplyrいましたが、機能が動作しません。誰かがこれで私を助けてくれるのを待っています

4

5 に答える 5

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

あまりにもエレガントではないもう1つのソリューションは、

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 に答える
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 に答える