r - 代表不同年份的每两连续行中的 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”或任何其他功能来实现这一点?
解决方案
这里有多个选项,但我不确定你的愿望输出..它似乎包含错误?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]
,但前提是您确定您的数据已经按正确的顺序排列!
推荐阅读
- sql - 如何在 SQL 中排除内部查询的结果?
- c# - Shimming object that doesn't have constructor
- mocha.js - 如何使用赛普拉斯断言搜索 JSON 响应
- java - Convert 201204121458 to date format 2012/04/12 14:59 in Java
- vb.net - Curl HTTP Post VB.NET
- react-native - 如何解决 TypeError: undefined is not an object (evalating '_core.pathUtils.urlToPathAndParams') in React-Native
- javascript - Create and scale image element in svg from input type image base64
- php - 有人可以指出我的 php 语句有什么问题吗?
- javascript - Vue.js: Have multiple different colored rows in table in v-for
- c# - C# - 具有十进制数据值的 SOAP XML 标记在 POST 期间消失