2016-08-01 5 views
0

私はこのようなデータフレームを持っている:R + dplyr:特定の行選択(第一及び同一の値を持つ行の最後の要素)

 starttime  sx  sy  time 
     <chr>  <chr> <chr>  <chr> 
1 1416924247145 667.75 824.25 1416924247145 
2 1416924247145 667.875 824.25 1416924247158 
3 1416924247145 668.5 824.5 1416924247198 
4 1416924257557 231.25 602.25 1416924257557 
5 1416924257557 230.625 602.25 1416924257570 
6 1416924257557 229.625 601.875 1416924257597 
7 1416924257557 228.75 601.25 1416924257610 
8 1416924257557 227.5 600.0 1416924257623 
9 1416924257557 216.875 587.75 1416924257717 
10 1416924257557 207.125 572.625 1416924257797 
11 1416924257600 525.425 525.636 1416924259999 

私はこのデータフレームのサブセットが最初で行を含むたいと開始時刻が等しい最後の要素。この例では、これらの行は1,3,4,10および11です。重要なのは、最初の行と最後の行も含まれていることです。私はdplyrパッケージでこれを実行しようとしています。これはこれに適していると思われます。私はGROUP_BY()フィルタ()最初の()最後の()機能を利用したが、私は私が望んでいた結果を得ることができませんでした。 dplyrを使用してこれを行う方法の

starttime  sx  sy  time 
     <chr>  <chr> <chr>  <chr> 
1 1416924247145 667.75 824.25 1416924247145 
3 1416924247145 668.5 824.5 1416924247198 
4 1416924257557 231.25 602.25 1416924257557 
10 1416924257557 207.125 572.625 1416924257797 
11 1416924257600 525.425 525.636 1416924259999 
+0

でこれを行うことができます。 https://cran.r-project.org/web/packages/dplyr/vignettes/window-functions.html –

+0

Googleは新しい質問を書いて時間を費やすこともありますが、それは価値がありません。 [this](http://stackoverflow.com/questions/8203818/how-to-select-the-first-and-lastrow-within-a-grouping-variable-in-a-data-frame)も参照してください。 、[this](http://stackoverflow.com/questions/19451032/r-returning-first-row-of-group)および[this](http://stackoverflow.com/questions/31833429/subset-by - グループごとの最初の値と最後の値 –

答えて

2

ワン:

library(dplyr) 
df %>% group_by(starttime) %>% slice(unique(c(1, n()))) 

#Source: local data frame [5 x 4] 
#Groups: starttime [3] 
# 
#  starttime  sx  sy   time 
#   <dbl> <dbl> <dbl>  <dbl> 
#1 1.416924e+12 667.750 824.250 1.416924e+12 
#2 1.416924e+12 668.500 824.500 1.416924e+12 
#3 1.416924e+12 231.250 602.250 1.416924e+12 
#4 1.416924e+12 207.125 572.625 1.416924e+12 
#5 1.416924e+12 525.425 525.636 1.416924e+12 

かをdata.tableを使用して:

library(data.table) 
setDT(df)[, .SD[unique(c(1,.N))], starttime] 

データを これは、結果はのようになります方法です

structure(list(starttime = c(1416924247145, 1416924247145, 1416924247145, 1416924257557, 1416924257557, 1416924257557, 1416924257557, 1416924257557, 1416924257557, 1416924257557, 1416924257600), sx = c(667.75, 667.875, 668.5, 231.25, 230.625, 229.625, 228.75, 227.5, 216.875, 207.125, 525.425), sy = c(824.25, 824.25, 824.5, 602.25, 602.25, 601.875, 601.25, 600, 587.75, 572.625, 525.636), time = c(1416924247145, 1416924247158, 1416924247198, 1416924257557, 1416924257570, 1416924257597, 1416924257610, 1416924257623, 1416924257717, 1416924257797, 1416924259999 )), .Names = c("starttime", "sx", "sy", "time"), class = "data.frame", row.names = c("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11")) 
0

私たちは、私が `dplyr`を使用して、ウィンドウ関数にハドレーのガイドを読むことをお勧めしますbase R

i1 <- with(df, as.logical(ave(starttime, starttime, 
     FUN = function(x) seq_along(x) %in% range(seq_along(x))))) 
df[i1,] 
#  starttime  sx  sy   time 
#1 1416924247145 667.750 824.250 1416924247145 
#3 1416924247145 668.500 824.500 1416924247198 
#4 1416924257557 231.250 602.250 1416924257557 
#10 1416924257557 207.125 572.625 1416924257797 
#11 1416924257600 525.425 525.636 1416924259999 
関連する問題