r - 根据 R 中的其他两列减去一列中的值

标签 r dataframe dplyr

我试图根据其他两列中的变量减去一列中的值。由于并非所有“ID”都位于之前和之后的所有站点,因此情况变得更加复杂。以下是数据框的示例:

> time <- c("before", "after", "before", "after", "before", "after", "before")
> site <- c("red", "red","red", "red","green", "green", "blue")
> ID <- c('A','A','B','B','B','B','C')
> cover <- c('10','5','10','5','10','5','3')
> df <- data.frame(time, site, ID, cover)

    time  site ID cover
1 before   red  A    10
2  after   red  A     5
3 before   red  B    10
4  after   red  B     5
5 before green  B    10
6  after green  B     5
7 before  blue  C     3

您可以看到“C”之前只出现在蓝色处。 结果将如下所示:

   site ID diff
1   red  A   -5
2   red  B   -5
3 green  B   -5
4  blue  C <NA>

我已经尝试过在另一个具有类似问题的堆栈溢出帖子中找到的代码,但我无法让它工作。

df_new <- df %>% group_by(time, site, ID) %>% 
summarise(diff = cover[time == c("after")] - cover[time == c("before")])

知道我哪里出错了吗?

谢谢!

最佳答案

我们可以通过 diff 进行分组,并使用 if/else 检查条件

library(dplyr)
df %>% 
    group_by(site, ID) %>% 
    summarise(diff = if(length(cover) == 1) NA 
         else diff(cover), .groups = 'drop')

-输出

# A tibble: 4 x 3
  site  ID     diff
  <chr> <chr> <dbl>
1 blue  C        NA
2 green B        -5
3 red   A        -5
4 red   B        -5

OP 的原始代码无法正常工作,因为其中一个分组在“时间”中没有同时具有“之后”和“之前”。我们可能需要为此指定一个 if/else 条件

关于r - 根据 R 中的其他两列减去一列中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67989650/

相关文章:

r - 根据组属性过滤组中的行

r - 创建一个复杂的新变量

python - 如何过滤 pandas DataFrame 并保留特定元素?

r - 如何创建动态 group_by 参数

r - 将 Shiny 的多个 slider 输入约束为总和为 100

r - dplyr:使用链接传递变量

r - 如何按组查找R中嵌套小标题之间的最后一个公共(public)值?

python - 如何计算包括零出现在内的分类值?

r - dplyr 重命名 plyrmr 中的等价物

r - 如何使用R获得角色的不同组合?