用一行替换data.table中的行集

时间:2018-05-12 16:41:43

标签: r replace data.table

我有以下data.table

 DT<- data.table(id=c(1,1,1,1,2,2,2,2),
            place = c("a","b","c","d","a","b","d","e"),
            seq = c(1,2,3,4,1,2,3,4))
 setkey(DT,id)   

data.table按id和seq排序:

setorder(DT,id,seq)

对于每个id,我想查找序列b,c,d,如果有这样的事情,我想用b和c替换单行的行,让我们说z(保持其他列的数据,如行中的a)。

所以在这种情况下,新的data.table应该是

DT.tobe<- data.table(id=c(1,1,1,2,2,2,2),
                     place = c("a","z","d","a","b","d","e"),
                     seq = c(1,2,4,1,2,3,4))
> DT.tobe
   id place seq
1:  1     a   1
2:  1     z   2
3:  1     d   4
4:  2     a   1
5:  2     b   2
6:  2     d   3
7:  2     e   4

我不得不说我不知道​​该尝试什么......我也可以接受data.frame解决方案的答案!

2 个答案:

答案 0 :(得分:1)

URL

给出了

res = setkey(DT[, {
  w = setDT(shift(place, 0:2, type="lead"))[.("b","c","d"), on=.(V1,V2,V3), which=TRUE, nomatch=0]
  if (length(w)){
    w2 = c(w, w + 1L)
    rbind(
      .SD[-w2],
      copy(.SD[w])[, place := "z"]  
    )
  } else .SD
}, by=id], id, seq)

使用针对序列b,c,d的连接找到位置w。从那里,我们确定要丢弃的行(w加上后面的行);要保留哪些行(w);以及在其中修改的内容(地点:=&#34; z&#34;)。

有太多不同的方向可能会被推广,所以如果出现更复杂的情况,最好只发布一个新问题。

答案 1 :(得分:0)

方法应该是按id进行分组,并评估条件/标记,其中place == "b"place == "c"大于0(意味着b&amp; c可用于id)。此标记(例如ReplB决定b是否会被z替换为id。此外,相同的标记(ReplB)用于过滤掉place == "c"的{​​{1}}行。

id

已更新:有关检查条件library(data.table) DT<- data.table(id=c(1,1,1,1,2,2,2,2), place = c("a","b","c","d","a","b","d","e"), seq = c(1,2,3,4,1,2,3,4)) setkey(DT,id) setorder(DT,id,seq) DT[,ReplB := sum(place == "b") > 0 & sum(place == "c") >0 ,by=id][ !(ReplB & place == "c"),.(id, place = ifelse(place=="b" & ReplB,"z",place),seq)] (即place)的顺序。

方法:=&gt;从a-b-c-d-e获取每个地点的位置,位置差异应为letters,以确保地点按顺序排列。

1