基于列名拆分的宽表数据重塑问题及R语言解决方法
列名拆分重塑表格的R实现
问题背景
我有一份外部分析程序输出的数据,为单行长表格式,列名类似Root.a、node359.a,共有数千列。需要将其重塑为以原列名前缀为行名、后缀为新列名的表格,且不想使用apply或循环,同时不依赖固定列名。
解决步骤与代码
通过R语言的pivot_longer、pivot_wider函数结合自定义赋值完成需求,具体如下:
# 将表格转为长格式 testnodes <- nodes %>% pivot_longer( everything(), cols_vary = "slowest", names_to = c("node","behavior"), names_pattern = "(.).(.)." ## 原始输出的列名各部分间用点分隔,第一个(.)是节点名,第二个(.)是行为标记(A到M) ) # 这一步得到的表格有点奇怪,会拆分每个单词的字母,但所有内容顺序是对的 # 生成节点名和行为标记的字符串向量 # 将节点名赋值给testnodes的第一列 testnodes$node <- names # 将行为字母赋值给testnodes的第二列 testnodes$behavior <- string_rep
长格式表格预览
> head(testnodes) # A tibble: 6 × 3 node behavior value <chr> <chr> <dbl> 1 Root A 0.0142 2 Root B 0.0581 3 Root C 0.0203 4 Root D 0.873 5 Root E 0.0215 6 Root F 0.00653
# 转换回宽格式表格 testnodes_w <- testnodes %>% pivot_wider( names_from = behavior, values_from = value )
最终宽格式表格预览
> head(testnodes_w) # A tibble: 6 × 14 node A B C D E F G H I J K L <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> 1 Root 1.42e-2 5.81e-2 2.03e-2 8.73e-1 2.15e-2 0.00653 0.00158 0.00307 1.26e-4 0.00034 0 3.60e-5 2 Outgroup 2.12e-2 2.30e-2 5.37e-2 2.27e-2 3.95e-2 0.0418 0.0297 0.0463 3.92e-2 0.0340 2.88e-1 3.36e-2 3 Ceropalini 4.26e-4 5.06e-4 4.07e-3 1.78e-4 5.88e-4 0.00738 0.00107 0.00521 3.22e-3 0.00550 1.2 e-3 9.59e-1 4 Ctenoceri… 2.97e-1 4.62e-2 2.86e-3 4.93e-1 3.98e-4 0.00733 0.137 0.00570 6.39e-4 0.00762 0 1.8 e-4 5 Dipogon1 3.17e-1 2.98e-2 2.60e-1 1.45e-1 6.20e-2 0.0175 0.112 0.0192 5.83e-3 0.0193 2.26e-3 3.39e-3 6 Minagenia 1.21e-4 2.3 e-5 8.18e-4 1.45e-4 7.1 e-5 0.00299 0.00162 0.00379 9.88e-1 0.00122 7.20e-5 5 e-4 # ℹ 还有1个变量: M <dbl>
内容的提问来源于stack exchange,提问作者Brenna
相关产品推荐
相关产品推荐

