【发布时间】:2018-09-23 19:03:40
【问题描述】:
我必须使用 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 向其中传递两个列名列表。
- list1 = 编号为 1 的所有列
- list2 = 编号为 2 的所有列
然后我可以计算每个匹配列表条目的总和,形式为:
map2(list1, list2, ~mutate(sum))
但是,我无法弄清楚如何使用 purrr 最好地解决这个问题。我对使用 purrr 比较陌生,所以我非常感谢您在这个问题上的任何帮助。
【问题讨论】:
-
当你有 54 列之后,列名会变成 ...
aa1, aa2, ab1, ab2等吗? -
我看到答案已被编辑以反映上述查询。由于缺乏一个整洁的解决方案......我认为可能会有类似
group_by的转置,例如slice_by??? -
非常感谢大家。我使用了 group_by 的经典 tidyverse 方法,在途中收集、传播和总结(非常类似于下面“Lorenzo G”和“G. Grothendieck”在答案 #1 中提出的方法)。我从未与 slice_by 合作过,但我想这也会很好地工作。我想使用映射的方法来使代码更短、更标准化,而“akrun”提出的解决方案非常适合这种需求。再次感谢您!