2016-01-27 4 views
0

У меня есть dataframe, который выглядит, как этотMutate dplyr выбрать первое значение переменной

test<-data.frame(x=c(100,100,101,101,102,102),y=c(1,2,1,2,1,2),z=c(NA,NA,0.1,NA,NA,0.5)) 

Я хочу, чтобы сгруппировать х. Затем создайте новую переменную ynew, где я бы посмотрел на z и выберем первое значение, которое не является NA, а затем установите ynew = y. Если оба значения в z равны NA, я хотел бы, чтобы yNew был NA. ynew должно быть NA, NA, 1,1,2,2. Я пытаюсь сделать это с помощью dplyr.

Я застрял со следующим

group_by(test,x) %>% mutate(ynew=ifelse(all(is.na(z)),NA_integer_,y[corresponding index])) 
+0

Дубликат: http://stackoverflow.com/questions/15070213/skip-na-values-using-fu n-first –

ответ

3

Следующая dplyr подход работает, если test является data.table

library(data.table) 
test <- data.table(test) 

test %>% group_by(x) %>% mutate(ynew = first(y[!is.na(z)])) 

# Source: local data table [6 x 4] 

#  x  y  z ynew 
# (dbl) (dbl) (dbl) (dbl) 
#1 100  1 NA NA 
#2 100  2 NA NA 
#3 101  1 0.1  1 
#4 101  2 NA  1 
#5 102  1 NA  2 
#6 102  2 0.5  2 

Или вы можете просто использовать data.table путь

test[, ynew := y[!is.na(z)], x] 
+0

Если просто объяснить, зачем мне преобразовывать catedrales в data.tabla? – rjss

+0

@ Подумайте, почему это не работает на df? – mtoto

+0

apperently * dplyr * не обрабатывает подмножество внутри своих функций очень хорошо (см. Также [этот комментарий] (http://stackoverflow.com/questions/34637206/dplyr-n-distinct-with-condition/34637819#comment57020872_34637206)) – Jaap

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