r - 按列名中的模式组合列
问题描述
我有一个非常宽的数据框,其中每列存在三次,后缀不同:xxx_A1.5
, xxx_A2.0
, xxx_A2.5
. 考虑这个例子:
df1 <- data.frame(col1_A1.5 = c(1,2,3,4),
col1_A2.0 = c(2,3,4,5),
col1_A2.5 = c(3,4,5,6),
col2_A1.5 = c(10,20,30,40),
col2_A2.0 = c(20,30,40,50),
col2_A2.5 = c(30,40,50,60))
我现在想根据这种模式将所有内容组合col1_xxx
成一列(名为; col2 等相同): . 因此,示例中的预期结果是:col1
col1_A2.0 [colA1.5, colA2.5]
col1 col2
1 "2 [1, 3]" "20 [10, 30]"
2 "3 [2, 4]" "30 [20, 40]"
3 "4 [3, 5]" "40 [30, 50]"
4 "5 [4, 6]" "50 [40, 60]"
由于我有 > 100 列,我需要一个基于模式的解决方案;我尝试了几种组合,mutate
但across
无法达到预期的结果。有人可以提供提示或解决方案吗?提前致谢。
解决方案
您可以使用split.default
基于列名中的模式拆分数据框,并用于imap
从每个列表的多列中创建一列。
purrr::imap_dfc(split.default(df1, sub('_.*', '', names(df1))), function(x, y)
tibble::tibble(!!y := sprintf('%d [%d, %d]',
x[[paste0(y, '_A2.0')]], x[[paste0(y, '_A1.5')]],
x[[paste0(y, '_A2.5')]])))
# col1 col2
# <chr> <chr>
#1 2 [1, 3] 20 [10, 30]
#2 3 [2, 4] 30 [20, 40]
#3 4 [3, 5] 40 [30, 50]
#4 5 [4, 6] 50 [40, 60]
推荐阅读
- plotly - 如何使用 Unstack 数据可视化 Plotly 热图
- python - 无法从 Spark GBT 分类器访问预测值
- javascript - 用确切的路径和参数问题反应路线
- python - Python - 一些图像和其他文件的资产包
- r - 如何检查列是否为r中的重复(故意)序列?
- python - Tkinter 的人工鼠标点击
- google-sheets - 创建包含日期、小时数和活动的堆积条形图
- yarnpkg - yarn link 列出所有注册的包
- apache-kafka - 根据时间戳对 Kafka 消息进行排序
- python - 使用 Pyspark 动态重命名数据框列