2015-06-11 2 views
5

Я столкнулся с проблемой с моими данными, где я хочу взять первый зарегистрированный ob счет score для каждого человека id и вычесть из этого последнего наблюдаемого score.Выберите первые наблюдаемые данные и используйте мутацию

Проблема с просьбой о первом наблюдении минус последнее наблюдение заключается в том, что иногда отсутствуют первые данные наблюдений.

Можно ли спросить о первой наблюдаемой оценке для каждого человека, тем самым пропуская любые отсутствующие данные?

Я построил ниже df, чтобы проиллюстрировать мою проблему.

help <- data.frame(id = c(5,5,5,5,5,12,12,12,17,17,20,20,20), 
        ob = c(1,2,3,4,5,1,2,3,1,2,1,2,3), 
        score = c(NA, 2, 3, 4, 3, 7, 3, 4, 3, 4, NA, 1, 4)) 

    id ob score 
1 5 1 NA 
2 5 2  2 
3 5 3  3 
4 5 4  4 
5 5 5  3 
6 12 1  7 
7 12 2  3 
8 12 3  4 
9 17 1  3 
10 17 2  4 
11 20 1 NA 
12 20 2  1 
13 20 3  4 

И что я надеюсь запустить код, который даст мне ...

id ob score es 
1 5 1 NA -1 
2 5 2  2 -1 
3 5 3  3 -1 
4 5 4  4 -1 
5 5 5  3 -1 
6 12 1  7 3 
7 12 2  3 3 
8 12 3  4 3 
9 17 1  3 -1 
10 17 2  4 -1 
11 20 1 NA -3 
12 20 2  1 -3 
13 20 3  4 -3 

Я пытаюсь работать из dplyr, и я понимаю использование команды «group_by», однако, не уверены, как «выбрать» только первые наблюдаемые оценки, а затем мутировать, чтобы создать es.

ответ

6

Я хотел бы использовать first() и last() (как dplyr функция) и na.omit() (из пакета по статистики по умолчанию.

Во-первых, я хотел бы убедиться, что колонка ваш счет был Numberic столбец с соответствующими значениями NA (не строки, как в ваш пример)

help <- data.frame(id = c(5,5,5,5,5,12,12,12,17,17,20,20,20), 
     ob = c(1,2,3,4,5,1,2,3,1,2,1,2,3), 
     score = c(NA, 2, 3, 4, 3, 7, 3, 4, 3, 4, NA, 1, 4)) 

, то вы можете сделать

library(dplyr) 
help %>% group_by(id) %>% arrange(ob) %>% 
    mutate(es=first(na.omit(score)-last(na.omit(score)))) 
+0

Когда я запускаю этот код на моих фактических данных, я получаю сообщение об ошибке -> «Ошибка: Дон» t знать, как генерировать значение по умолчанию для объекта класса numeric ". Переменные являются числовыми, и существует достаточное количество НС, например. у некоторых id нет ничего, кроме NA, а у других нет. Есть предположения? – bpace

+0

Если у вас нет ничего, кроме значений NA, что вы хотите вернуть? Было бы неплохо, если бы ваши образцы данных включали этот сценарий вместе с желаемым результатом. – MrFlick

+0

Согласовано. Таким образом, проблема заключается в наличии трех разных переменных для оценки, и каждый идентификатор имеет оценку для одной из трех переменных. Я предположил, что могу просто запустить код для каждого из них, но если у id в group_by нет данных для оценки, тогда появляется сообщение об ошибке ... вероятно, потому что na.omit вынимает все данные и там нечего вычитать. – bpace

0

Это решение является Litt ле многословен, только б/с она опирается на несколько вспомогательных функций FIRST и LAST:

# The position (indicator) of the first value that evaluates to TRUE. 
LAST <- function (x, none = NA) { 
    out <- FIRST(reverse(x), none = none) 
    if (identical(none, out)) { 
     return(none) 
    } 
    else { 
     return(length(x) - out + 1) 
    } 
} 
# The position (indicator) of the last value that evaluates to TRUE. 
FIRST <- function (x, none = NA) 
{ 
    x[is.na(x)] <- FALSE 
    if (any(x)) 
     return(which.max(x)) 
    else return(none) 
} 

# returns the difference between the first and last non-missing values 
diff2 <- function(x) 
    x[LAST(!is.na(x))] - x[FIRST(!is.na(x))] 


library(dplyr) 
help %>% 
    group_by(id) %>% 
    arrange(ob) %>% 
     summarise(diff = diff2(score)) 
1
library(dplyr) 

temp <- help %>% group_by(id) %>% 
    arrange(ob) %>% 
    filter(!is.na(score)) %>% 
    mutate(es = first(score) - last(score)) %>% 
    select(id, es) %>% 
    distinct() 

help %>% left_join(temp) 
Смежные вопросы