% -6ren">
gpt4 book ai didi

r - 在列的子集上使用 mutate rowwise

转载 作者:行者123 更新时间:2023-12-04 00:28:21 25 4
gpt4 key购买 nike

我正在尝试创建一个新列,其中将包含对 tibble 的列的子集按行进行计算的结果, 并将此新列添加到现有的 tibble。像这样:

df <- tibble(
ID = c("one", "two", "three"),
A1 = c(1, 1, 1),
A2 = c(2, 2, 2),
A3 = c(3, 3, 3)
)

我实际上想从 base R 做一个 dplyr 等效的代码:

df$SumA <- rowSums(df[,grepl("^A", colnames(df))])

我的问题是这不起作用:

df %>% 
select(starts_with("A")) %>%
mutate(SumA = rowSums(.))
# some code here

...因为我去掉了“ID”列,以便让 mutate 在其他(数字)列上运行 rowSums。我曾尝试在 mutate 之后在管道中使用 cbind 或 bind_cols,但它不起作用。 mutate 的所有变体都不起作用,因为它们就地起作用(在 tibble 的每个单元格内,而不是跨列,即使是按行)。

这确实有效,但并不是一个优雅的解决方案:

df %>% 
mutate(SumA = rowSums(.[,grepl("^A", colnames(df))]))

是否有任何基于 tidyverse 的解决方案不需要 grepl 或方括号,而只需要更标准的 dplyr 动词和参数?

我的预期输出是这样的:

df_out <- tibble(
ID = c("one", "two", "three"),
A1 = c(1, 1, 1),
A2 = c(2, 2, 2),
A3 = c(3, 3, 3),
SumA = c(6, 6, 6)
)

最佳千焦

最佳答案

这是使用 purrr::pmaptidyverse 中进行逐行计算的一种方法。这最好与实际需要逐行运行的函数一起使用;简单的添加可能会以更快的方式完成。基本上,我们使用 selectpmap 提供输入列表,这让我们可以使用 select 帮助程序,例如 starts_with匹配 如果您需要正则表达式。

library(tidyverse)
df <- tibble(
ID = c("one", "two", "three"),
A1 = c(1, 1, 1),
A2 = c(2, 2, 2),
A3 = c(3, 3, 3)
)

df %>%
mutate(
SumA = pmap_dbl(
.l = select(., starts_with("A")),
.f = function(...) sum(...)
)
)
#> # A tibble: 3 x 5
#> ID A1 A2 A3 SumA
#> <chr> <dbl> <dbl> <dbl> <dbl>
#> 1 one 1 2 3 6
#> 2 two 1 2 3 6
#> 3 three 1 2 3 6

reprex package 创建于 2019-01-30 (v0.2.1)

关于r - 在列的子集上使用 mutate rowwise,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54450723/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com