R data.table 更新一组行的列表类型的列



>假设我们有以下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

我们现在要从带有"id"2 和 3 的行中的"val"列中删除元素"e"。我能够通过以下方式实现这一目标:

> 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), ..] ?
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"])]

最新更新