每两行连续的ddply函数差异代表不同的年份

时间:2019-01-15 11:20:50

标签: r

我正在尝试使用“ ddply”函数来计算代表两个不同年份的连续两个连续行中的差异。数据集看起来像这样

year ID value
1 2005  A    10
2 2015  A    20
3 2005  B    25
4 2015  B     5
5 2005  C    10
6 2015  C    15

我正在使用以下功能

ddply(df, "ID",  function(x) (x[2,] - x[1,]))

但是,似乎我的函数出错了,因为对包括非数字变量在内的变量进行了计算。我得到以下结果。

year ID value
1   10 NA    10
2   10 NA   -20
3   10 NA     5

我知道解决方案可能非常简单。我希望得到以下摘要结果。

 ID  change
 A    10
 B    -5 
 C     5

有人知道如何使用“ ddply”或其他任何功能来实现这一目标吗?

1 个答案:

答案 0 :(得分:0)

这里有多个选项,但是我不确定您的期望输出..它似乎包含错误? B应该是-20吗?

样本数据

library( data.table)
data <- fread("year ID value
2005  A    10
2015  A    20
2005  B    25
2015  B     5
2005  C    10
2015  C    15", header = TRUE, stringsAsFactor = FALSE)

dt <- data
df <- as.data.frame( data )

data.table

library(data.table)
dt[, list( delta = value[year == 2015] - value[year == 2015] ), by = .(ID)][]
#    ID delta
# 1:  A    10
# 2:  B   -20
# 3:  C     5

dplyr

library( dplyr )
df %>% group_by( ID ) %>% summarise( delta = value[year == 2015] - value[year == 2005])
# A tibble: 3 x 2
#   ID    delta
#   <chr> <int>
# 1 A        10
# 2 B       -20
# 3 C         5

在两种方法中,都可以用value[year == 2015] - value[year == 2015]替换value[2] - value[1],但前提是要确保您的数据已经按照正确的顺序排列!