R 求和使用 group_by、select 大和的组,然后使用不同的 group_by 重复求和
R sum using group_by, select groups with large sum, then repeat sum using different group_by
我有一个解决这个问题的有效方法,但我很好奇是否有比我更有效的方法来解决这个问题。
我有一个如下所示的数据框:
df <- data.frame("Factor1" = c(rep("A", 4), rep("B", 4), rep("C", 4), rep("D", 4)),
"Factor2" = c(rep(c(rep("a", 2), rep("b", 2)), 4)),
"Value" = c(c(1:4), c(21:24), c(11:14), c(41:44)))
我首先对每个Factor1
求和所有Value
,以确定哪个Factor1
具有最大的Value
,然后select最上面的n
(本例中为 2)Value
的总和,如下所示:
df2 <- df %>% group_by(Factor1) %>%
summarise(Factor1.sum = sum(Value)) %>%
arrange(desc(Factor1.sum)) %>%
top_n(n=2) %>% ungroup()
既然我确定了B
和D
作为最大和Value
的前两个Factor1
,我想再次计算Value
,但这次按 Factor1
和 Factor2
分组,如下所示。
df3 <- subset(df, Factor1 %in% df2$Factor1) %>%
group_by(Factor1, Factor2) %>%
summarise(Factor2.sum = sum(Value))
这正是我想要的,但我需要创建额外的文件(df2
和 df3
),我想知道 dplyr
中是否有一些功能我不知道的软件包(或任何软件包)将使这个过程更简单?
这里是同一事物的更短变体,使用 count
作为 group_by
和 summarize
的快捷方式,并使用 left_join
获取第一步的结果作为第二部分的 Factor1 列表。
count(df, Factor1, wt = Value, sort = TRUE) %>%
slice(1:2) %>%
left_join(count(df, Factor1, Factor2, wt = Value, name = "Factor2.sum"))
Joining, by = "Factor1"
Factor1 n Factor2 Factor2.sum
1 D 170 a 83
2 D 170 b 87
3 B 90 a 43
4 B 90 b 47
我有一个解决这个问题的有效方法,但我很好奇是否有比我更有效的方法来解决这个问题。
我有一个如下所示的数据框:
df <- data.frame("Factor1" = c(rep("A", 4), rep("B", 4), rep("C", 4), rep("D", 4)),
"Factor2" = c(rep(c(rep("a", 2), rep("b", 2)), 4)),
"Value" = c(c(1:4), c(21:24), c(11:14), c(41:44)))
我首先对每个Factor1
求和所有Value
,以确定哪个Factor1
具有最大的Value
,然后select最上面的n
(本例中为 2)Value
的总和,如下所示:
df2 <- df %>% group_by(Factor1) %>%
summarise(Factor1.sum = sum(Value)) %>%
arrange(desc(Factor1.sum)) %>%
top_n(n=2) %>% ungroup()
既然我确定了B
和D
作为最大和Value
的前两个Factor1
,我想再次计算Value
,但这次按 Factor1
和 Factor2
分组,如下所示。
df3 <- subset(df, Factor1 %in% df2$Factor1) %>%
group_by(Factor1, Factor2) %>%
summarise(Factor2.sum = sum(Value))
这正是我想要的,但我需要创建额外的文件(df2
和 df3
),我想知道 dplyr
中是否有一些功能我不知道的软件包(或任何软件包)将使这个过程更简单?
这里是同一事物的更短变体,使用 count
作为 group_by
和 summarize
的快捷方式,并使用 left_join
获取第一步的结果作为第二部分的 Factor1 列表。
count(df, Factor1, wt = Value, sort = TRUE) %>%
slice(1:2) %>%
left_join(count(df, Factor1, Factor2, wt = Value, name = "Factor2.sum"))
Joining, by = "Factor1"
Factor1 n Factor2 Factor2.sum
1 D 170 a 83
2 D 170 b 87
3 B 90 a 43
4 B 90 b 47