如何计算分组数据框R中多列的非重复值

cetgtptt  于 2023-03-20  发布在  其他
关注(0)|答案(2)|浏览(117)

我有这样一个数据框:

v_1 <- c("1a", "1b","1c", "2a", "2b", "2c", "3a", "3b","3c", "4a", "4b", "4c")
v_2 <- c(1,1,1,2,2,2,3,3,3,4,4,4)
v_3 <- c("dog", "dog", "dog", "dog", "dog", "dog", "cat", "cat", "cat", "cat", "cat", "cat")
v_4 <- c(1:12)

df <- data.frame(v_1, v_2, v_3, v_4)
df
   v_1 v_2 v_3 v_4
1   1a   1 dog   1
2   1b   1 dog   2
3   1c   1 dog   3
4   2a   2 dog   4
5   2b   2 dog   5
6   2c   2 dog   6
7   3a   3 cat   7
8   3b   3 cat   8
9   3c   3 cat   9
10  4a   4 cat  10
11  4b   4 cat  11
12  4c   4 cat  12

我想对这个 Dataframe 进行分组,并计算v_1和v_2的不同值。如果我只对v_1中的计数感兴趣,这很容易。我只需要:

library(dplyr)

df_grouped <- df %>% 
  group_by(v_3) %>% 
  summarise(v_4_sum = sum(v_4), 
            v_1_count = n())

  v_3   v_4_sum v_1_count
  <chr>   <int>     <int>
1 cat        57         6
2 dog        21         6

如果我还想看到v_2的计数,似乎我必须像这样使用group_by两次:

df_grouped_v2 <- df %>% 
  group_by(v_2, v_3) %>% 
  summarise(v_4_sum = sum(v_4), 
            v_1_count = n())

df_grouped_v22 <- df_grouped_v2 %>% 
  group_by(v_3) %>% 
  summarise(v_4_sum = sum(v_4_sum), 
            v_1_count = sum(v_1_count), 
            v_2_count = n())

df_grouped_v22

     v_3   v_4_sum v_1_count v_2_count
      <chr>   <int>     <int>     <int>
    1 cat        57         6         2
    2 dog        21         6         2

这是我想要的结果,但似乎不是直接的。特别是如果我有一个巨大的 Dataframe ,group_by操作是时间密集型的,我宁愿只使用一次。

gr8qqesn

gr8qqesn1#

对于非重复值,可以使用n_distinct()而不是n()

library(dplyr)

df |>
  summarise(v_4_sum = sum(v_4),
            across(c(v_1, v_2), n_distinct, .names = "{.col}_count"),
            .by = v_3)

  v_3 v_4_sum v_1_count v_2_count
1 dog      21         6         2
2 cat      57         6         2
n8ghc7c1

n8ghc7c12#

如果您有一个很大的表,可能不应该使用dplyr,但无论哪种方式,您都不需要仅按v_3分组。

library(data.table)
setDT(df)
df[, .(v_4_sum = sum(v_4), v_1_count = uniqueN(v_1), v_2_count = uniqueN(v_2)), v_3]

输出:

v_3 v_4_sum v_1_count v_2_count
   <char>   <int>     <int>     <int>
1:    dog      21         6         2
2:    cat      57         6         2

相关问题