2015-02-16 2 views
0

У меня есть этот кадр данных:Извлечение строки событий из кадра данных

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 

Я хочу, чтобы извлечь строки, которые имеет новый столбец eventin value. Например, для ID=1, var=3 имеет value от 2 по адресу TIME=0. Это значение остается неизменным на TIME=1, поэтому я бы взял первую строку только в TIME=0 и отбросил вторую строку. Однако в третьей строке значение для var=3 изменилось на zero, поэтому мне также нужно извлечь эту строку. И так далее для остальных переменных. Это необходимо применять для каждого идентификатора объекта. Для приведенного выше df, результат должен выглядеть следующим образом:

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 

Может ли один помочь мне сделать это в R? У меня огромный набор данных, и я хочу извлечь информацию, в которой произошло новое событие для значения каждого var. У меня 4 переменные в кадре данных с номером (3, 4,5,6 и 7). Вышеприведенное является примером для 2 переменных (переменное число: 3 и 4).

ответ

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 

в основном, я создал дополнительную переменную, которая возвращает «1», когда значение такое же, как в предыдущей строке внутри групп уникальных комбинаций ID/VAR. Затем мы избавляемся от этой переменной перед возвратом результата.

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 
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')) 
+0

, но 'unique' не будет определять значения, одинаковые для групп ID/var, но изменения после предыдущего наблюдения. – jalapic

+0

@jalapic Извините, я, возможно, пропустил эту часть. Не могли бы вы создать лучший пример – akrun

+0

Это не мой пример! но из того, что я могу собрать из OP, они, похоже, хотят обнаружить «изменения» в значениях. Итак, допустим, последняя строка: «2 4 8 10 1», тогда значение = 10 повторяет себя для комбинации ID = 2, var = 4, но 10 - это новый переход от предыдущего значения. Я думаю, что ОР хочет включить эти наблюдения/строки. – jalapic

 Смежные вопросы

  • Нет связанных вопросов^_^