如何计算与 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 中相同列值关联的两个行值的差异?的主要内容,如果未能解决你的问题,请参考以下文章

R 中热图/聚类默认值的差异(热图与热图.2)?

如何通过比较火花中相同列的两个数据帧来计算列值的数量

R组合具有相似值的行

如何用R将列中相同值的行值分组? [复制]

需要将列值求和到相同的 rowno

计算具有与相同 ID 相关的不同列值的结果