2017-05-25 69 views
0

的更新類型列表的列假設我們有以下data.table:[R data.table爲一組行

> a <- data.table(id=(1:3), val=vector("list",length(3))) 
> a$val <- list(c("a","b"),c("c","d","e"),c("f","e")) 
> a 
    id val 
1: 1 a,b 
2: 2 c,d,e 
3: 3 f,e 

我們現在要從列刪除元素「E」「VAL」在「ID」 2和3 行我能一起實現這一點:

> for (x in c(2,3)) { 
    a[id==x, val := list(list(val[[1]][ val[[1]] != 'e']))] 
    } 
> a 
    id val 
1: 1 a,b 
2: 2 c,d 
3: 3 f 

怎麼可以這樣的東西做過類似

a[id %in% c(2,3), ..] ? 

回答

0
function_remove<-function(x,y){ 
    if (y %in% c(2,3)){ 
    x<-x[[1]] 
    list(x[x!="e"]) 
    } else{ 
    x 
    } 
} 

a[,list(function_remove(val,id)),by=1:nrow(a)] 
    nrow V1 
1: 1 a,b 
2: 2 c,d 
3: 3 f 

或者,你可以這樣做:

function_remove_1<-function(x){ 
    x[x!="e"] 
} 
a[id %in% c(2,3),]$val<-lapply(a[id %in% c(2,3),val],function_remove_1) 

最後(如下建議),我們還可以通過參考更新:

a[id %in% c(1,2), val := lapply(val, function(x) x[x!="e"])] 
+0

感謝您使用lapply的想法!我修改了第二個解決方案以使用參考賦值: 'a [id%in%c(1,2),val:= lapply(val,function(x)x [x!=「e」])] ' 你想在你的答案中包括它嗎? –

+0

@Olege legorov,完成 – Vitalijs

+0

真棒。再次感謝! –