2016-11-20 10 views
-1

私はdata.tableおよび/またはdplyrに関する助けを探しています。私はこのようなデータフレームを持っている:data.tableまたはdplyrをgroupbyで使用し、日付のサブセット化を使用してR内のデータを操作する

Name  Date   X  Y 
Mike  2016-10-21 3.2 1.6 
Mike  2016-10-23 3.1 1.4 
Mike  2016-10-24 4.9 3.8 
Mike  2016-10-25 5.7 4.2 
Mike  2016-10-28 0.2 -1.1 
Bob  2016-10-21 2.2 -1.1 
Bob  2016-10-22 0.2 -3.6 
Bob  2016-10-24 -9.2 -14.1 
Bob  2016-10-25 -7.2 -12.1 
Alice 2016-10-20 7.2 6.1 
Alice 2016-10-21 2.2 0.1 
Alice 2016-10-23 13.2 8.1 
Alice 2016-10-25 12.6 8.8 
Alice 2016-10-27 7.7 4.7 
Alice 2016-10-28 8.2 5.0 

私は一人一人のためにX & Yの平均値を返すことができるようにしたいのですが、それは値のみを使用するように、しかし、私はそれをサブセットしたいのですが各個人の3つの最新の日付から、古い日付のデータは無視されます。私はまた、これらの3つの最新の日付の間にあった日数を返すこともしたいと思います。

Name  DaysBetween avgX avgY 
Mike    4 3.6  2.3 
Bob    3 -5.4 -9.9 
Alice    3 9.5  6.2 

編集注:このデータは常に最新で注文することになるので、我々はおそらくだけではなく、一人一人のための「最後の3」のデータポイントを取ることができる理想的には、私はこのようなデータフレームで終わるだろう日付論理を使って、どれが最近のものであるかを見つけることができます。

ありがとうございました!

+0

あなたはエラーや間違った結果を出したものを試しましたか? – lukeA

+0

いいえ、私はしていません。これまでのところ、私は各人のすべてのデータポイントについてX&Yの平均を得ることができました。しかし、私は3つの最新の日付を使用するためだけにサブセットする方法に苦労しています。私はdata.tableとdplyrのつもりです。 – user3808992

答えて

0

あなたは、データをフィルタリングするdplyr::top_nを使用することができます。

library(dplyr) 

df %>% mutate(Date = as.Date(Date)) %>% # parse to Date class, if not already 
    group_by(Name) %>% 
    top_n(3, Date) %>% # filter to max 3 dates for each group 
    summarise(DaysBetween = max(Date) - min(Date), 
       avgX = mean(X), 
       avgY = mean(Y)) 

## # A tibble: 3 × 4 
##  Name DaysBetween avgX  avgY 
## <fctr>  <time> <dbl>  <dbl> 
## 1 Alice  3 days 9.5 6.166667 
## 2 Bob  3 days -5.4 -9.933333 
## 3 Mike  4 days 3.6 2.300000 
+0

ありがとうございます!これは素晴らしい作品です! – user3808992

2

私たちは、上記のdata.table

library(data.table) 
setDT(df1)[order(-Date), .(DaysBetween = as.integer(Date[1L] - Date[3L]), 
     avgX = mean(X[1:3]), avgY = round(mean(Y[1:3]),2)), by = Name] 
# Name DaysBetween avgX avgY 
#1: Mike   4 3.6 2.30 
#2: Alice   3 9.5 6.17 
#3: Bob   3 -5.4 -9.93 
+1

ありがとうございます。これも素晴らしい仕事でした! – user3808992

+0

@ user3808992ありがとうございます。また、[this](http://stackoverflow.com/help/someone-answers)を読むこともできます。 – akrun

1

を使用することができ、ここで、すべての偉大な応答である反復的なアプローチである:

#initialize the output frame 
outputFrame = as.data.frame(matrix(nrow = length(unique(train$Name)), 
ncol = 4)) 

#renaming the data frame 
names(outputFrame) = c("Names", "daysBetween", "avgX", "avgY") 

#turn the date to a date 
train$Date = as.Date(train$Date, "%m/%d/%Y") 

#initialize the outputCounter 
outputCounter = 1 

#iterates over every unique Name in the data frame 
for(name in as.character(unique(train$Name))) 
{ 
    #subsets the dataframe into the values of each given level of Name 
    dfSubset = train[which(train$Name == name),] 

    #Orders the dataframe by date 
    dfSubset = dfSubset[order(dfSubset$Date),] 

    #get the 3 most recent dates 
    dfSubset = dfSubset[(nrow(dfSubset) -2):nrow(dfSubset),] 

    #fill the names 
    outputFrame$Names[outputCounter] = name 

    #fill the days between 
    outputFrame$daysBetween[outputCounter] = as.numeric(max(dfSubset$Date) - min(dfSubset$Date)) 

    #get the average X 
    outputFrame$avgX[outputCounter] = mean(dfSubset$X) 

    #get the average Y 
    outputFrame$avgY[outputCounter] = mean(dfSubset$Y) 

    #increment outputCounter 
    outputCounter = outputCounter +1 
} 

列車があなたのデータフレームであることを前提に

関連する問題