从数据框中提取事件行

时间:2015-02-16 02:39:26

标签: r dataframe extraction

我有这个数据框:

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=1var=3value2 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)。

3 个答案:

答案 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'))