我有以下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解决方案的答案!
答案 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