如何计算与 R 中相同列值关联的两个行值的差异?
Posted
技术标签:
【中文标题】如何计算与 R 中相同列值关联的两个行值的差异?【英文标题】:How do I calculate the difference of two row values associated with the same column value in R? 【发布时间】:2020-06-14 16:15:26 【问题描述】:我有一个 R 问题。
我想计算与另一列中相同的Record_ID
关联的两个行值sjc
是否存在增加(1)/减少(0)?
这是生成数据框的代码:
df <- data.frame("Record_ID" = c(1, 1,2,2,3,3,4,4,5,5),
"sjc" = c(3,28,1,1,2,0,2,4,9,2))
原始数据框
这就是我想要的样子:
结果数据框
感谢您的帮助!
【问题讨论】:
看看dplyr的lead()
和lag()
,或者data.table的shift()
-functions
【参考方案1】:
在base R中,我们可以使用ave
,按Record_ID
分组,检查sjc
值的差值是否大于0。
df$inc_dec <- with(df, ave(sjc, Record_ID, FUN = function(x) c(NA, diff(x) > 0)))
df
# Record_ID sjc inc_dec
#1 1 3 NA
#2 1 28 1
#3 2 1 NA
#4 2 1 0
#5 3 2 NA
#6 3 0 0
#7 4 2 NA
#8 4 4 1
#9 5 9 NA
#10 5 2 0
使用dplyr
,我们可以使用lag
来获取之前的值
library(dplyr)
df %>% group_by(Record_ID) %>% mutate(inc_dec = +(sjc - lag(sjc) > 0))
与data.table
类似
library(data.table)
setDT(df)[, inc_dec := +(sjc - shift(sjc) > 0), Record_ID]
【讨论】:
这么快的回复!我使用了 dplyr 解决方案,它就像一个魅力。谢谢!你能解释一下mutate函数里面的部分吗?我不确定我是否理解它是如何工作的。 @SaraAltamirano 我们使用lag
将当前sjc
值与之前的sjc
值进行比较。前面的+
将(TRUE
/FALSE
)的逻辑值分别转换为1/0
。以上是关于如何计算与 R 中相同列值关联的两个行值的差异?的主要内容,如果未能解决你的问题,请参考以下文章