我试图根据其他两列中的变量减去一列中的值。由于并非所有“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/