2017-11-11 1 views
2

私は以下のようなデータフレームdfを持っています。これは、数ヶ月にわたって獲得された/失われたAGGポイントを持ちます。私はネットポイントを獲得見つける必要がdataframe - 前の行にアクセスする

name month  agg_points 
A 2017-04-01 1 
B 2017-04-01 3 
C 2017-04-01 0 
A 2017-05-01 2 
B 2017-05-01 5 
C 2017-05-01 2 
A 2017-06-01 4 
B 2017-06-01 5 
C 2017-06-01 1 

/月ごとに失われた - これは現在の月の時点から前月のポイントを差し引くことを意味します。前月のポイントにdfでアクセスするにはどうすればよいですか?

期待出力dplyr

name month  net_points 
A 2017-04-01 1 
B 2017-04-01 3 
C 2017-04-01 0 
A 2017-05-01 1 
B 2017-05-01 2 
C 2017-05-01 2 
A 2017-06-01 2 
B 2017-06-01 0 
C 2017-06-01 -1 

答えて

3

は、あなたが適切にあなたgrouparrange後の行をlag機能を使用することができます。

library(dplyr) 
df %>% 
    group_by(name) %>% 
    arrange(month, .by_group = TRUE) %>% 
    mutate(net_points = agg_points - lag(agg_points, default = 0)) %>% 
    arrange(month) 

#> # A tibble: 9 x 4 
#> # Groups: name [3] 
#> name  month agg_points net_points 
#> <chr>  <chr>  <int>  <int> 
#> 1  A 2017-04-01   1   1 
#> 2  B 2017-04-01   3   3 
#> 3  C 2017-04-01   0   0 
#> 4  A 2017-05-01   2   1 
#> 5  B 2017-05-01   5   2 
#> 6  C 2017-05-01   2   2 
#> 7  A 2017-06-01   4   2 
#> 8  B 2017-06-01   5   0 
#> 9  C 2017-06-01   1   -1 

をデータ

df <- read.table(text = "name month  agg_points 
A 2017-04-01 1 
B 2017-04-01 3 
C 2017-04-01 0 
A 2017-05-01 2 
B 2017-05-01 5 
C 2017-05-01 2 
A 2017-06-01 4 
B 2017-06-01 5 
C 2017-06-01 1", header = TRUE, stringsAsFactors = FALSE) 
1

一つの方法:

with(df, { 
    x <- xtabs(agg_points ~ month + name) 
    x[-1, ] <- diff(x) 
    as.data.frame(x, responseName = 'net_points') 
}) 
#  month name net_points 
#1 2017-04-01 A   1 
#2 2017-05-01 A   1 
#3 2017-06-01 A   2 
#4 2017-04-01 B   3 
#5 2017-05-01 B   2 
#6 2017-06-01 B   0 
#7 2017-04-01 C   0 
#8 2017-05-01 C   2 
#9 2017-06-01 C   -1 
1

あなたは新しい一時変数遅れを作成し、net_pointsを取得するためにX3 - lagを使用することができます。

library(data.table) 
DT <- setDT(df) 
setkey(DT,month) 
x <- DT[, list(netpoint = diff(agg_points), month = .SD[-1,month]),by = name] 

xは、差分値とdata_tableです:

library(readr) 
df <- read_csv(
    "A,2017-04-01,1 
    B,2017-04-01,3 
    C,2017-04-01,0 
    A,2017-05-01,2 
    B,2017-05-01,5 
    C,2017-05-01,2 
    A,2017-06-01,4 
    B,2017-06-01,5 
    C,2017-06-01,1", 
    col_names = F 
) 
str(df) 
library(dplyr) 
df %>% group_by(X1) %>% mutate(lag = lag(X3), diff = ifelse(!is.na(lag), X3 - lag, X3)) %>% 
    select(-lag) 

は、私がmarkdly答えのdata.table同等のものを持っている

 X1   X2 X3 diff 
    <chr>  <date> <int> <int> 
1  A 2017-04-01  1  1 
2  B 2017-04-01  3  3 
3  C 2017-04-01  0  0 
4  A 2017-05-01  2  1 
5  B 2017-05-01  5  2 
6  C 2017-05-01  2  2 
7  A 2017-06-01  4  2 
8  B 2017-06-01  5  0 
9  C 2017-06-01  1 -1 
0

を与えます。私たちは、その後、xとDT

DT <- x[DT, on = .(name,month)][,c("name","month","agg_points","netpoint")] 

をマージし、

DT[,netpoint :={netpoint[1]<-agg_points[1]; netpoint},by=name] 

name  month agg_points netpoint 
1: A 2017-04-01   1  1 
2: B 2017-04-01   3  3 
3: C 2017-04-01   0  0 
4: A 2017-05-01   2  1 
5: B 2017-05-01   5  2 
6: C 2017-05-01   2  2 
7: A 2017-06-01   4  2 
8: B 2017-06-01   5  0 
9: C 2017-06-01   1  -1 

だろう答えをmarkdlyに近い方法を与える(agg_pointsに等しい)netpointの最初の値を追加します。

DT <- setDT(df) 
setkey(DT,month) 
DT[,netpoint := agg_points - c(NA, agg_points[-.N]), by = name] 

しかし、私はまだ行う必要があります

DT[,netpoint :={netpoint[1]<-agg_points[1]; netpoint},by=name] 

私を嫌う最初の行を埋める。誰でも良い方法がありますか?

関連する問題