我必须关注使用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的一个选项。我们获得数据集的uniquenames前缀('nm1'),使用map(来自purrr)遍历唯一名称,selectmatches前缀值的列'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/

10-11 12:02