将值大于 n 的行汇总为 R 中的一个
Sum rows with value larger than n into one in R
我有一个数据框:
df <- data.frame(count=c(0,1,2,3,4,5,6), value=c(100,50,60,70,2,6,8))
count value
1 0 100
2 1 50
3 2 60
4 3 70
5 4 2
6 5 6
7 6 8
如何将大于 "n"
的值加到一行中?因此,例如,如果我选择 n = 3
那么我想要:
count value
1 0 100
2 1 50
3 2 60
4 3 70
5 >3 16
将计数强制分解为 3
以上的所有因素并折叠成 ">3"
。然后 aggregate
按计数计算的值。
df$count <- factor(ifelse(df$count > 3, ">3", df$count), levels = c(1:3, ">3"))
aggregate(value ~ count, df, sum)
# count value
#1 0 100
#2 1 50
#3 2 60
#4 3 70
#5 >3 16
R 4.1.0 或以上。
从 R 4.1.0 开始,有一个新的管道运算符和一个新的 lambda,如果要保持列 count
不变,这意味着,如果转换只是临时的,则可以使用它们.
df |>
within(count <- factor(ifelse(count > 3, ">3", count), levels = c(1:3, ">3"))) |>
(\(x)aggregate(value ~ count, x, sum))()
# count value
#1 0 100
#2 1 50
#3 2 60
#4 3 70
#5 >3 16
我们可以使用
library(dplyr)
df %>%
group_by(count = case_when(count >3 ~ '>3',
TRUE ~ as.character(count))) %>%
summarise(value = sum(value), .groups = 'drop')
另一个基本 R 选项使用 aggregate
transform(
aggregate(
. ~ count,
transform(df, count = replace(count, count > 3, Inf)),
sum
),
count = replace(count, is.infinite(count), ">3")
)
给予
count value
1 0 100
2 1 50
3 2 60
4 3 70
5 >3 16
这是一个使用 replace
的 dplyr 解决方案。缺点是,如果 >3
应该是最后一行,则它必须是 arranged
(否则它会非常简洁)。
library(dplyr)
df %>%
group_by(count = replace(count, count > 3, ">3")) %>%
summarise(value = sum(value)) %>%
arrange(count == ">3")
#> # A tibble: 5 x 2
#> count value
#> <chr> <dbl>
#> 1 0 100
#> 2 1 50
#> 3 2 60
#> 4 3 70
#> 5 >3 16
由 reprex package (v0.3.0)
于 2021-08-26 创建
我有一个数据框:
df <- data.frame(count=c(0,1,2,3,4,5,6), value=c(100,50,60,70,2,6,8))
count value
1 0 100
2 1 50
3 2 60
4 3 70
5 4 2
6 5 6
7 6 8
如何将大于 "n"
的值加到一行中?因此,例如,如果我选择 n = 3
那么我想要:
count value
1 0 100
2 1 50
3 2 60
4 3 70
5 >3 16
将计数强制分解为 3
以上的所有因素并折叠成 ">3"
。然后 aggregate
按计数计算的值。
df$count <- factor(ifelse(df$count > 3, ">3", df$count), levels = c(1:3, ">3"))
aggregate(value ~ count, df, sum)
# count value
#1 0 100
#2 1 50
#3 2 60
#4 3 70
#5 >3 16
R 4.1.0 或以上。
从 R 4.1.0 开始,有一个新的管道运算符和一个新的 lambda,如果要保持列 count
不变,这意味着,如果转换只是临时的,则可以使用它们.
df |>
within(count <- factor(ifelse(count > 3, ">3", count), levels = c(1:3, ">3"))) |>
(\(x)aggregate(value ~ count, x, sum))()
# count value
#1 0 100
#2 1 50
#3 2 60
#4 3 70
#5 >3 16
我们可以使用
library(dplyr)
df %>%
group_by(count = case_when(count >3 ~ '>3',
TRUE ~ as.character(count))) %>%
summarise(value = sum(value), .groups = 'drop')
另一个基本 R 选项使用 aggregate
transform(
aggregate(
. ~ count,
transform(df, count = replace(count, count > 3, Inf)),
sum
),
count = replace(count, is.infinite(count), ">3")
)
给予
count value
1 0 100
2 1 50
3 2 60
4 3 70
5 >3 16
这是一个使用 replace
的 dplyr 解决方案。缺点是,如果 >3
应该是最后一行,则它必须是 arranged
(否则它会非常简洁)。
library(dplyr)
df %>%
group_by(count = replace(count, count > 3, ">3")) %>%
summarise(value = sum(value)) %>%
arrange(count == ">3")
#> # A tibble: 5 x 2
#> count value
#> <chr> <dbl>
#> 1 0 100
#> 2 1 50
#> 3 2 60
#> 4 3 70
#> 5 >3 16
由 reprex package (v0.3.0)
于 2021-08-26 创建