2017-02-06 6 views
3

Пример данные кадрR: Как объединить строки кадра данных с одним и тем же идентификатором и принять самое новое значение, отличное от NA?

date  name  speed acceleration 
1/1/17  bob  5  NA 
1/1/15  george 5  NA 
1/1/15  bob  NA  4 
1/1/17  bob  4  NA 

Я хочу, чтобы сконденсировать все строки с этим именем в одну строку и сохранить новейшее значение не-пу для столбца скорости и ускорения.

Желаемая выход

date  name  speed acceleration 
1/1/17  bob  5  4 
1/1/15  george 5  NA 
+0

См. [Этот пост] (http://stackoverflow.com/questions/24237399/how-to-select-the-rows-with-maximum-values-in-each-group-with-dplyr) для выбора максимальное значение (max работает с датами). –

+0

@Malo: Здесь он не максимальный, но самый новый, вы не берете максимальную скорость, а самую последнюю скорость w.r.t. даты. Поэтому я не думаю, что ваша ссылка релевантна. – Scarabee

ответ

3

Вы можете сделать это следующим образом:

library(dplyr) 
library(lubridate) 

input = read.table(text = 
"date  name  speed acceleration 
    1/1/17  bob  5  NA 
    1/1/15  george 5  NA 
    1/1/15  bob  NA  4 
    1/1/17  bob  4  NA", 
    header = TRUE, stringsAsFactors = FALSE) 

output <- input %>% 
    mutate(date = mdy(date)) %>% # or maybe dmy, depending on your date format 
    group_by(name) %>% 
    arrange(desc(date)) %>% 
    summarise_all(funs(na.omit(.)[1])) 

output 
# # A tibble: 2 × 4 
#  name  date speed acceleration 
# <chr>  <date> <int>  <int> 
# 1 bob 2017-01-01  5   4 
# 2 george 2015-01-01  5   NA 
+0

Немного проще просто использовать 'na.omit'. – alistaire

+2

Что-то вроде 'dat%>% ... summaryize_all (function (x) na.omit (x) [1])' упростит это, применив одну и ту же функцию ко всем столбцам. – thelatemail

+0

или использовать 'funs':' summaryise_all (funs (na.omit (.) [1])) ' – alistaire

0

Вот вариант использования data.table. Преобразование «data.frame» в «data.table» (setDT(input)), order «даты» после преобразования в Date класса, сгруппированных по «имя», петля через колонки и получить первый не-NA элемент

library(data.table) 
library(lubridate) 
setDT(input)[order(-mdy(date)), lapply(.SD, function(x) x[!is.na(x)][1]), name] 
#  name date speed acceleration 
#1: bob 1/1/17  5   4 
#2: george 1/1/15  5   NA