2013-07-22 41 views
0

我有一個data.frame像這樣價值觀通過索引更改data.frame的值在兩個外部列表

df1<- read.table(text=" X1 X2 X3 X4 X5 
      0 0 -1 0 0 
      -1 0 0 -1 0 
      0 0 0 0 0", header=TRUE) 

和兩個列表,像這樣

list1<- list() 
list1[1]<-4 
list1[2]<- list(c(2,5)) 
list1[3]<- 0 

list2<- list() 
list2[1]<- 3 
list2[2]<- list(c(1,4)) 
list2[3]<- 0 

我想要做的就是使用list1從df1中選擇列。這些必須根據使用list2選擇的列值進行更改。

因此,例如:當選擇list1的第一個元素時,第一行的第四列將被選中。同時,將選擇list2的第一個元素,以提取第一行第三列的值。最後,df [1,4]將被df [1,3]替代。

最後data.frame將作如下

X1 X2 X3 X4 X5 
1 0 0 -1 -1 0 
2 -1 -1 0 -1 -1 
3 0 0 0 0 0 

我一直在嘗試,因爲每天我自己,但即使在所以這裏閱讀類似的問題後,我無法弄清楚如何對付列表。

+0

我的嘗試,如果有人想有一個笑或微笑: mapply(FUN = myFunc的,我= seq_along(列表1),X = lapply(列表1,打印),Y = lapply(list2,print)) –

回答

3

這似乎是一個非常簡單的使用案例for循環,因爲你要分配:

df2 <- df1 
for(i in 1:length(list1)){ 
    if(!list1[[i]]==0 & !list2[[i]]==0) # deal with `0`'s 
     df2[i,list1[[i]]] <- df1[i,list2[[i]]] 
} 
df2 

,這將給你這樣的:

> df2 
    X1 X2 X3 X4 X5 
1 0 0 -1 -1 0 
2 -1 -1 0 -1 -1 
3 0 0 0 0 0 
+0

感謝您的迴應。我應該說明兩件事情: 1.遇到0時,我簡單地忽略該行,並且 2.我試圖讓沒有循環做,因爲我的data.frames是巨大的......除非沒有其他選擇。 –

+1

請參閱編輯關於1.關於2,'mapply'和類似的仍然是循環,它們只是更漂亮。 – Thomas

+0

哦!我沒有意識到這個問題。好吧,謝謝。我不能要求更多,所以我會自己練習,看看是否有矢量化解決方案。我必須趕上你在編程知識中的使用! –

1

一個瘋狂的mapply解決方案,這可能只是強調有時一個for環路是好的:

t(
    data.frame(
    mapply(
     function(l1,l2,sq) { 
      if(all(l1==0) & all(l2==0)) 
      {df1[sq,]} else 
      {df1[sq,l1] <- df1[sq,l2]; df1[sq,]} 
     }, 
     list1, 
     list2, 
     seq_along(list1) 
    ) 
) 
) 

結果:

X1 X2 X3 X4 X5 
X1 0 0 -1 -1 0 
X2 -1 -1 0 -1 -1 
X3 0 0 0 0 0 
+0

感謝您的貢獻;它確實有助於瞭解在這種情況下爲什麼可以。 –