我必须关注使用R的问题。总之,我想基于数据帧中不同列对的计算来在数据帧中创建多个新列。
数据如下:
df <- data.frame(a1 = c(1:5),
b1 = c(4:8),
c1 = c(10:14),
a2 = c(9:13),
b2 = c(3:7),
c2 = c(15:19))
df
a1 b1 c1 a2 b2 c2
1 4 10 9 3 15
2 5 11 10 4 16
3 6 12 11 5 17
4 7 13 12 6 18
5 8 14 13 7 19
输出应该如下所示:
a1 b1 c1 a2 b2 c2 sum_a sum_b sum_c
1 4 10 9 3 15 10 7 25
2 5 11 10 4 16 12 9 27
4 7 13 12 6 18 16 13 31
5 8 14 13 7 19 18 15 33
我可以使用dplyr通过以下方式完成一些手动工作来实现此目的:
df %>% rowwise %>% mutate(sum_a = sum(a1, a2),
sum_b = sum(b1, b2),
sum_c = sum(c1, c2)) %>%
as.data.frame()
因此,要做的是:取出其中包含字母“ a”的列,按行计算总和,并创建一个名为sum_ [letter]的总和新列。对不同字母的列重复上述步骤。
但是,这是可行的,如果我有一个包含300个不同列对的大型数据集,那么手动输入将非常重要,因为我必须编写300个mutate调用。
最近,我偶然发现了R包“ purrr”,我的猜测是这将解决我以更自动化的方式完成我想做的事情的问题。
特别是,我认为能够使用purrr:map2,我将两个列名称列表传递给了purrr:map2。
list1 =其中所有数字为1的所有列
list2 =其中所有数字为2的所有列
然后,我可以按照以下形式计算每个匹配列表条目的总和:
map2(list1, list2, ~mutate(sum))
但是,我不知道如何使用purrr最好地解决这个问题。我对使用purrr很陌生,因此,我非常感谢在此问题上的任何帮助。
最佳答案
这是purrr
的一个选项。我们获得数据集的unique
的names
前缀('nm1'),使用map
(来自purrr
)遍历唯一名称,select
列matches
前缀值的列'nm1',使用reduce
添加行并将列(bind_cols
)与原始数据集绑定
library(tidyverse)
nm1 <- names(df) %>%
substr(1, 1) %>%
unique
nm1 %>%
map(~ df %>%
select(matches(.x)) %>%
reduce(`+`)) %>%
set_names(paste0("sum_", nm1)) %>%
bind_cols(df, .)
# a1 b1 c1 a2 b2 c2 sum_a sum_b sum_c
#1 1 4 10 9 3 15 10 7 25
#2 2 5 11 10 4 16 12 9 27
#3 3 6 12 11 5 17 14 11 29
#4 4 7 13 12 6 18 16 13 31
#5 5 8 14 13 7 19 18 15 33
关于r - 如何将Purrr中的map与dplyr::mutate结合使用以基于列对创建多个新列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49816669/