【发布时间】:2022-06-16 05:06:36
【问题描述】:
我有一个包含超过 100 列的数据框,有些是数字的,有些不是。
所有以“_f”或“_m”结尾的变量都是数字变量,我想总结所有以相同模式开头但以“_f”或“_m”结尾的对。
这是我的数据框中变量名称的示例:
xxxxxxxxxxxxx_age1_f
xxxxxxxxxxxxx_age1_m
xxxxxxxxxxxxx_age2_f
xxxxxxxxxxxxx_age2_m
xxxxxxxxxxxxx_age3_f
xxxxxxxxxxxxx_age3_m
yyyyyyyyyy_age1_f
yyyyyyyyyy_age1_m
yyyyyyyyyy_age2_f
yyyyyyyyyy_age2_m
yyyyyyyyyy_age3_f
yyyyyyyyyy_age3_m
yyyyyyyyyy_age4_f
yyyyyyyyyy_age4_m
yyyyyyyyyy_age5_f
yyyyyyyyyy_age5_m
zzzzzzzzzzzzzzzzzzzz_age1_f
zzzzzzzzzzzzzzzzzzzz_age1_m
zzzzzzzzzzzzzzzzzzzz_age2_f
zzzzzzzzzzzzzzzzzzzz_age2_m
zzzzzzzzzzzzzzzzzzzz_age3_f
zzzzzzzzzzzzzzzzzzzz_age3_m
text_var_11
text_var_222
text_var_33333
(我在这里用 x, y z 来抽象名称以使我的问题更清楚,它们实际上并不是那样命名的)
我的第一个解决方案是使用 dplyr::mutate() 对每一对求和,如下所示:
mutate( ... ) %>%
mutate( yyyyyyyyyy_age2 = yyyyyyyyyy_age2_f + yyyyyyyyyy_age2_m) %>%
mutate( yyyyyyyyyy_age3 = yyyyyyyyyy_age3_f + yyyyyyyyyy_age3_m) %>%
mutate( ... ) %>%
这可行,但必须有更智能的方法来做到这一点,而无需对所有变量对重复此操作。
寻找解决方案后,我发现最接近的是这个 Sum all columns whose names start with a pattern, by group
但是,由于两个原因,建议的解决方案在我的情况下不起作用:
-
substr()不适用于我的问题,因为变量名称的长度发生了变化 - 此方法假定我只有想要求和的变量,而在我的情况下,我还有许多其他变量不以“_f”或“_m”结尾并且不需要求和(并且无法求和)因为有些是文字)
我想可以修改解决方案以适用于我的案例,但我不确定如何。
编辑:这里是使用 dput 创建的示例数据
structure(list(Groups = c("xx", "xx", "xx"), xxxxx_age0_f = c(8,
0, 7), xxxxx_age0_m = c(5, 0, 0), xxxxx_age1_f = c(1,
0, 0), xxxxx_age1_m = c(3, 2, 0), xxxxx_age2_f = c(0,
0, 2), xxxxx_age2_m = c(0, 1, 0), zzzz_age0_f = c(4,
2, NA), zzzz_age0_m = c(3, 6, NA), zzzz_age1_f = c(0,
0, NA), zzzz_age1_m = c(2, 0, NA), zzzz_age2_f = c(4,
1, NA), zzzz_age2_m = c(3, 1, NA)), row.names = c(NA, -3L
), class = c("tbl_df", "tbl", "data.frame"))
ps:这个简化的例子只有一个分类变量,而我有数百个。
【问题讨论】:
-
我建议您提供一段数据框作为可重现的示例。这会增加您获得帮助的机会。
-
Minimal 可重复的例子是最好的。包括 2 或 3 列对,一列您不想求和,以及 3 或 4 行 - 这应该足以演示解决方案。
dput()是共享数据的最佳方式,因为它是可复制/可粘贴的。dput(your_data[1:3, c("relevant", "columns", "for", "example")]). -
按照@GregorThomas 的建议,使用
dput函数在此处插入数据样本! -
starts_with()将成为您的朋友。也就是说,这是为什么tidy 数据帧比不整洁的数据帧更好的经典示例。您的布局不整洁,因为列名包含创建摘要所需的信息。有了整洁的数据框,解决问题不仅更容易,而且解决方案更健壮。 -
我已经添加了 dput 输出,感谢@GregorThomas 的建议