首页 > 解决方案 > 代表不同年份的每两连续行中的 R ddply 函数差异

问题描述

我正在尝试使用“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”或任何其他功能来实现这一点?

标签: r

解决方案


这里有多个选项,但我不确定你的愿望输出..它似乎包含错误?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 )

数据表

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],但前提是您确定您的数据已经按正确的顺序排列!


推荐阅读