2013-10-27 26 views
0

大家好,我正在使用R中的數據框列表,它很棒但我有一個小問題。我有下一個數據幀列表。該列表的實際擴展獲得了超過20個數據幀,有1000個觀察值和20個列。在這裏,我把結構:如何在數據框的名稱中爲數據框列表中的每個元素創建R新變量,其值等於元素的位置

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.listmy.list[1]=a1,my.list[2]=a2,my.list[3]=a3,my.list[4]=a4, my.list[5]=a5)中的數據幀的位置,其中括號中的數字表示位置或數據幀。我使用llply表格plyr包但功能不起作用。我等待有人能幫助我解決這個

回答

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 
0

也許不是最完美的解決方案,但這樣做的工作

counter=0 
llply(my.list,function(x) { 
    counter<<-counter+1 
    tmp=data.frame(x,counter) 
    colnames(tmp)[3]=paste0("a",counter) 
    tmp 
}) 
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 
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) 
3
lapply(seq(my.list), function(x) "[[<-"(my.list[[x]], paste0("a", x), value = x)) 

將做的伎倆。

函數"[[<-"(x, y, value = z)x[[y]] <- z類似,但不修改x。而是返回修改後的版本。

+0

你能否解釋一下「[[< - 」在做什麼?> – jenesaisquoi

+0

@noah我在我的答案中加了一個解釋。 –

相關問題