我有这样一个数据框:
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操作是时间密集型的,我宁愿只使用一次。
2条答案
按热度按时间gr8qqesn1#
对于非重复值,可以使用
n_distinct()
而不是n()
:n8ghc7c12#
如果您有一个很大的表,可能不应该使用
dplyr
,但无论哪种方式,您都不需要仅按v_3
分组。输出: