在 R 中,如果其他两列中的值组合是唯一的,则取多个变量的总和

In R, take sum of multiple variables if combination of values in two other columns are unique

我正在尝试扩展这个已解决问题的答案, 但是因为我是堆栈溢出的新手,所以我不能直接评论 post 所以这是我的问题:

我有一个如下所示的数据集,但包含大约 100 列二进制数据,如“ani1”和“bni2”列所示。

Locations <- c("A","A","A","A","B","B","C","C","D", "D","D")
seasons <- c("2", "2", "3", "4","2","3","1","2","2","4","4")
ani1 <- c(1,1,1,1,0,1,1,1,0,1,0)
bni2 <- c(0,0,1,1,1,1,0,1,0,1,1)

df <- data.frame(Locations, seasons, ani1, bni2)

     Locations seasons ani1 bni2
1          A       2    1    0
2          A       2    1    0
3          A       3    1    1
4          A       4    1    1
5          B       2    0    1
6          B       3    1    1
7          C       1    1    0
8          C       2    1    1
9          D       2    0    0
10         D       4    1    1
11         D       4    0    1

我试图根据位置和季节对所有列求和,但我想简化,所以我得到第 3 列的总列以及位置和季节的每个独特组合之后的总列。 问题是并非所有列的每个位置和季节组合的值都是 1,而且它们都有不同的名称。

我想要这样的东西:

    Locations seasons ani1 bni2
1         A       2    2    0
2         A       3    1    1
3         A       4    1    1
4         B       2    0    1
5         B       3    1    1
6         C       1    1    0
7         C       2    1    1
8         D       2    0    0
9         D       4    1    2

这是我使用 for 循环的尝试:

 df2 <- 0
 for(i in 3:length(df)){
  testdf <- data.frame(t(apply(df[1:2], 1, sort)), df[i])
  df2 <- aggregate(i~., testdf, FUN=sum)
 }

我收到以下错误:

Error in model.frame.default(formula = i ~ ., data = testdf) : 
  variable lengths differ (found for 'X1')

谢谢!

您可以在 group_by 之后使用 dplyr::summariseacross

library(dplyr)

df %>% 
  group_by(Locations, seasons) %>% 
  summarise(across(starts_with("ani"), ~sum(.x, na.rm = TRUE))) %>%
  ungroup()

另一种选择是使用 tidyr 包中的函数将数据重塑为长格式。这避免了必须 select 第 3 列开始的问题。

library(dplyr)
library(tidyr)

df %>% 
  pivot_longer(cols = -c(Locations, seasons)) %>% 
  group_by(Locations, seasons, name) %>% 
  summarise(Sum = sum(value, na.rm = TRUE)) %>% 
  ungroup() %>% 
  pivot_wider(names_from = "name", values_from = "Sum")

结果:

# A tibble: 9 x 4
  Locations seasons  ani1  ani2
  <chr>       <int> <int> <int>
1 A               2     2     0
2 A               3     1     1
3 A               4     1     1
4 B               2     0     1
5 B               3     1     1
6 C               1     1     0
7 C               2     1     1
8 D               2     0     0
9 D               4     1     2