我有这个数据框:
df <-
ID var TIME value method
1 3 0 2 1
1 3 2 2 1
1 3 3 0 1
1 4 0 10 1
1 4 2 10 1
1 4 4 5 1
1 4 6 5 1
2 3 0 2 1
2 3 2 2 1
2 3 3 0 1
2 4 0 10 1
2 4 2 10 1
2 4 4 5 1
2 4 6 5 1
我想提取在value
列中有新事件的行。例如,对于ID=1
,var=3
在value
处2
TIME=0
TIME=1
。此值在TIME=0
保持不变,因此我将仅在var=3
处取第一行并丢弃第二行。但是,第三行,zero
的值已更改为df
,因此我还要提取此行。等等其他变量。这必须适用于每个主题ID。对于上述dfevent <-
ID var TIME value method
1 3 0 2 1
1 3 3 0 1
1 4 0 10 1
1 4 4 5 1
2 3 0 2 1
2 3 3 0 1
2 4 0 10 1
2 4 4 5 1
,结果应如下所示:
var
任何人都可以帮我在R中做这件事吗?我有一个庞大的数据集,我想提取每个{{1}}的值发生新事件的信息。我在数据框中有4个变量编号(3,4,5,6和7)。以上是2个变量的示例(变量号:3和4)。
答案 0 :(得分:2)
这是使用dplyr
library(dplyr)
df %>%
group_by(ID, var) %>%
mutate(tf = ifelse(value==lag(value), 1, 0)) %>%
filter(is.na(tf) | tf==0) %>%
select(-tf)
# ID var TIME value method
#1 1 3 0 2 1
#2 1 3 3 0 1
#3 1 4 0 10 1
#4 1 4 4 5 1
#5 2 3 0 2 1
#6 2 3 3 0 1
#7 2 4 0 10 1
#8 2 4 4 5 1
基本上,我创建了一个额外的变量,它返回一个&#39; 1&#39;当该值与唯一ID / var组合的组中的前一行相同时。然后我们在返回输出之前去掉这个变量。
答案 1 :(得分:2)
基础解决方案:
df[with(df, abs(ave(value,ID,FUN=function(x) c(1,diff(x)) ))) > 0,]
# ID var TIME value method
#1 1 3 0 2 1
#3 1 3 3 0 1
#4 1 4 0 10 1
#6 1 4 4 5 1
#8 2 3 0 2 1
#10 2 3 3 0 1
#11 2 4 0 10 1
#13 2 4 4 5 1
答案 2 :(得分:1)
根据预期结果,您还可以尝试rleid
data.table
library(data.table)#data.table_1.9.5
setDT(df)[df[, .I[1L] , list(ID, var, rleid(value))]$V1]
# ID var TIME value method
#1: 1 3 0 2 1
#2: 1 3 3 0 1
#3: 1 4 0 10 1
#4: 1 4 4 5 1
#5: 2 3 0 2 1
#6: 2 3 3 0 1
#7: 2 4 0 10 1
#8: 2 4 4 5 1
或者与@thelatemail类似的方法
setDT(df)[df[, .I[abs(c(1,diff(value)))>0] , ID]$V1]
或者
unique(setDT(df)[, id:=rleid(value)], by=c('ID', 'var', 'id'))