使用列集进行更长的透视

Pivot longer with sets of columns

提问人:Maleeha Shahid 提问时间:4/13/2023 最后编辑:MarkMaleeha Shahid 更新时间:7/20/2023 访问量:57

问:

我有一个巨大的数据集,其中包含 32 个人的大量变量(参数)。它是一个广泛的数据集,其列范围包括例如所有个人的名字、所有个人的姓氏、角色、机构和其他参数。例如,所有变量都以相同的前缀开头,新变量以 1 到 32 的数值开头,然后是用下划线分隔的各个参数的名称。例如,第二组变量的示例是 。每个参数都有 32 个数字。college_collaborator _college_collaborator_1_First_name, college_collaborator_2_First_name, college_collaborator_3_First_namecollege_collaborator_1_last_name, college_collaborator_2_last_name, college_collaborator_3_last_name

数据集如下所示: dataset_1

dataset_1 <- read.table(text=
"ID     cb_1_fn  cb_2_fn cb_3_fn cb_1_ln cb_2_ln cb_3_ln
1      Jill       Pete    Edy     James    Lil    febe
2      Aliya      Edy     Jill    Troy     adam   tom
3      Tom        John    Moss    Pete     Fun    Tom
4      Phill      Sam     Kale    Jack     Dallas lil
5      Tim        David   Sam     Dale     Simmon Fig", header=TRUE)

使用具有相似前缀的变量名称(如上所述)整理一大组列以同时将它们折叠成更小的列集的最佳方法是什么?即时将所有名字都放在同一列中,将姓氏放在相同但不同的列中,依此类推。输出数据集如下所示:pivot_longer

Status      fn          ln

cb_1       Jill        James
cb_1       Aliya       Troy 
cb_1       Tom         Pete 
cb_1       Phill       Jack
cb_1       Tim         Dale
cb_2       Pete        Lil
cb_2       Edy         Adam
cb_2       John        Son
cb_2       Sam         Dallas
cb_2       David       Simmon
cb_3       Edy         Febe
cb_3       Jill        tom
cb_3       Moss        Tom
cb_3       Kale        Lil
cb_3       Sam         Fig

我的斗争不仅是分离名称,而且还要折叠各个列下的某些变量集。

r tidyr 数据操作

评论

2赞 zephryl 4/13/2023
将哨兵与 : 一起使用。".value"names_patterndf %>% pivot_longer(!ID, names_to = c("Status", ".value"), names_pattern = "(cb_\\d)_(.+)")
0赞 Maleeha Shahid 4/13/2023
@zephryl这很有效。你能解释一下正则表达式部分吗?看起来第一个捕获组正在将前缀部分置于状态,而第二个捕获组正在为单个值提供名称。谢谢
0赞 zephryl 4/13/2023
右 -- 结合参数,这告诉 R 将模式应用于选择列名称,将第一个捕获组的所有唯一结果透视为单独的行(将匹配的模式作为名为 的列中的值),但将第二个捕获组的所有唯一结果保留为列(将匹配的模式作为名称)。如果这只是更令人困惑的事情,也许 ?pivot_longer 的 、 和 示例部分会有所帮助。names_to = c("Status", ".value")Statusnames_tonames_pattern

答:

0赞 Mark 7/20/2023 #1

Zephryl 在评论中的回答还不错,但它不适用于您在问题中给出的其他示例,例如 .college_collaborator_1_First_name

下面的代码为您给出的示例和问题中的数据集提供了正确的解决方案。在开始第二组之前,它使用后视来查看数字,然后使用下划线:

pivot_longer(dataset_1, -ID, names_pattern = "(.+)_((?<=\\d_).+)", names_to = c("Status", ".value"))