2016-06-14 60 views
4

我有腳本,生成一些數據表,我想與其他列分開,並將結果存儲在新列中的數據表。這是一個例子。r數據表除列的列第二個列列表

library(data.table) 
dt <- data.table(V1 = c(5.553465, 4.989168, 2.563682, 6.987971, 19.220936), 
       V2 = c(4.248335, 19.768138, 3.840026, 17.411003, 17.939368), 
       V3 = c(9.683953, 15.344424, 11.729091, 7.534210, 5.404000), 
       V4 = c(5.949093, 4.553023, 9.765656, 11.211069, 4.085964), 
       V5 = c(11.814671, 5.460138, 2.492230, 1.48792, 8.164280)) 

list1 <- list(c("V1", "V2", "V3")) 
list2 <- list(c("V2", "V4", "V5")) 
listRatio <- list(c("rat1","rat2","rat3")) 

我已經嘗試了各種方法來將list1元素中的值除以list2元素中的值,但不成功。兩個在下面;既不可行。

dt[, (listRatio) := list1/list2] 
dt[, c("rat1","rat2","rat3") := mapply(dt, function(x,y) x/y, x = c(V1, V2, V3), y = c(V2, V4, V5))] 

回答

5

我們需要使用[[list轉換爲vector,然後得到一個listmget每個矢量的值,使用Map分(/)每個list值的相應欄目並分配它到向量(listRatio[[1]])。

dt[, (listRatio[[1]]) := Map(`/`, mget(list1[[1]]), mget(list2[[1]]))] 
dt 
#   V1  V2  V3  V4  V5  rat1  rat2  rat3 
#1: 5.553465 4.248335 9.683953 5.949093 11.814671 1.3072098 0.7141147 0.8196549 
#2: 4.989168 19.768138 15.344424 4.553023 5.460138 0.2523843 4.3417611 2.8102630 
#3: 2.563682 3.840026 11.729091 9.765656 2.492230 0.6676210 0.3932174 4.7062635 
#4: 6.987971 17.411003 7.534210 11.211069 1.487920 0.4013537 1.5530190 5.0635854 
#5: 19.220936 17.939368 5.404000 4.085964 8.164280 1.0714389 4.3904861 0.6619077 

注:由於@Frank在評論中提到的,這是更好地創建變量名的vector而不是list

+1

也許值得一提:在OP不應該在名單包裹這裏... – Frank

+0

我知道足夠關於R現在從何時使用列表有點教程中受益字符變量以及何時使用向量,如果相關,則使用數據表焦點。任何人都可以添加一個鏈接到這樣的教程? – JerryN

+1

改進答案(至少對於我的目的)是使用'as.vector'作爲列表並使用dt [,(listRatio):= Map('/',mget(list1),mget(list2) )]'。這會自動生成listRatio的所有元素的值。 – JerryN

2

利用data.frame功能

dt <- data.frame(V1 = c(5.553465, 4.989168, 2.563682, 6.987971, 19.220936), 
       V2 = c(4.248335, 19.768138, 3.840026, 17.411003, 17.939368), 
       V3 = c(9.683953, 15.344424, 11.729091, 7.534210, 5.404000), 
       V4 = c(5.949093, 4.553023, 9.765656, 11.211069, 4.085964), 
       V5 = c(11.814671, 5.460138, 2.492230, 1.48792, 8.164280)) 

list1 <- list(dt[,c("V1", "V2", "V3")]) 
list2 <- list(dt[,c("V2", "V4", "V5")]) 
dt$rat3 <- dt$rat2 <- dt$rat1 <- "" 
dt[, c("rat1","rat2","rat3")] <- unlist(list1)/unlist(list2) 

     V1  V2  V3  V4  V5  rat1  rat2  rat3 
1 5.553465 4.248335 9.683953 5.949093 11.814671 1.3072098 0.7141147 0.8196549 
2 4.989168 19.768138 15.344424 4.553023 5.460138 0.2523843 4.3417611 2.8102630 
3 2.563682 3.840026 11.729091 9.765656 2.492230 0.6676210 0.3932174 4.7062635 
4 6.987971 17.411003 7.534210 11.211069 1.487920 0.4013537 1.5530190 5.0635854 
5 19.220936 17.939368 5.404000 4.085964 8.164280 1.0714389 4.3904861 0.6619077 
+1

問題是關於data.table解決方案。另外,根據你認爲適當的內容,你已經改變了OP的'list1','list2'等。 – akrun

+1

@akrun你是對的,只是給出一個想法,如果他使用data.frame函數,而不是data.table –

+0

在這種情況下,它是可以的。 – akrun

相關問題