2016-06-14 83 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

相关问题