我有一个数据框架,例如:
df <- data.frame(col1 = c(1, 2500,1, 1, 1),
col2 = c(12, NA, 8,9, 5),
col3 = c(25, 48, 7, 9, 14))
df
col1 col2 col3
1 1 12 25
2 2500 NA 48
3 1 8 7
4 1 9 9
5 1 5 14我希望只有当单元格值大于1时,才能对行进行求和,而忽略NA值,以生成如下数据帧:
df_desired <- data.frame(col1 = c(2500),
col2 = sum(12, 8,9, 5),
col3 = sum(25, 48, 7, 9, 14))
df_desired
col1 col2 col3
1 2500 34 103我已经走了这么远:
df_test <- df %>%
summarise_at(vars(contains("col")), sum, na.rm = TRUE)
df_test
col1 col2 col3
1 2504 34 103我尝试过许多ifelse的变体,但都没有成功。到目前为止,我只找到了跨列的条件求和和添加新列的示例。
发布于 2022-07-06 17:39:51
summarise与across的结合
library(dplyr)
df %>%
summarise(across(everything(), ~ sum(.x[.x > 1], na.rm = TRUE)))
col1 col2 col3
1 2500 34 103或者在base R和colSums中,在对小于2到NA的元素进行replace之后
colSums(replace(df, df < 2, NA), na.rm = TRUE)
col1 col2 col3
2500 34 103 发布于 2022-07-06 17:36:21
在设置map_dbl语句中的每个1到0之后,我们可以使用ifelse:
library(purrr)
library(dplyr)
df %>%
mutate(across(, ~ifelse(. == 1, 0, .))) %>%
map_dbl(~ sum(.x, na.rm = TRUE))或者没有purrr
library(dplyr)
df %>%
mutate(across(, ~ifelse(. == 1, 0, .))) %>%
summarise(across(, ~sum(., na.rm = TRUE)))col1 col2 col3
2500 34 103 发布于 2022-07-06 17:38:34
使用sapply函数,您可以如下所示解决问题:
sapply(df, function(x) sum(x[x>1], na.rm=TRUE))
col1 col2 col3
2500 34 103或者使用summarise函数
df |>
summarise(across(, ~ sum(.[.>1], na.rm=TRUE)))
col1 col2 col3
1 2500 34 103https://stackoverflow.com/questions/72887703
复制相似问题