2017-02-06 11 views
3

例データフレームR:データフレームの行を同じIDで結合し、最新の非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 

私は1つの行に同じ名前を持つすべての行を凝縮し、速度および加速度列の最新非NA値を保持します。

あなたはこのようにそれを行うことができます所望の出力

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

選択方法は[this post](http://stackoverflow.com/questions/24237399/how-to-select-the-rows-with-maximum-values-in-each-group-with-dplyr)を参照してください。最大値(最大値は日付で動作) –

+0

@マロ:ここでは最大ではありませんが、最新のものではなく、最大速度ではなく最新の速度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%>%... summarize_all(function(x)na.omit(x)[1])のようなものは、これを単純化して、同じ関数をすべての列に適用します。 – thelatemail

+0

または 'funs'を使用してください:' summarise_all(funs(na.omit(。)[1])) ' – alistaire

0

data.tableを使用してオプションです。 、「名前」でグループ化されたDateクラスに変換した後、「data.table」(setDT(input))、order「日付」に「data.frame」を変換し、列をループし、最初の非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 
関連する問題