R/tidyverse中用pivot_wider()实现除ID列外所有列的宽表转换
解决方案
你可以直接在pivot_wider()的values_from参数中使用负向选择排除不需要参与宽转换的列,无需手动枚举所有待转换的数值列,也不依赖列的排列顺序:
data_long %>% pivot_wider( id_cols = c(ID, time), names_from = rater, values_from = -c(ID, time, rater) )
上述写法会自动将ID、time、rater之外的所有列作为待转换的数值列,完美适配列数极多、ID列与数值列交错排列的场景,后续如果数据新增数值列也可以自动适配,不需要修改代码。
补充灵活筛选方案
如果需要更精细化的列筛选逻辑,还可以结合tidyselect生态的其他选择器实现:
- 仅对数值类列做宽转换,自动忽略其他类型的非ID列:
data_long %>% pivot_wider( id_cols = c(ID, time), names_from = rater, values_from = where(is.numeric) & !c(ID, time) )
- 仅对符合命名规则的列做宽转换,比如示例中所有以
v开头的数值列:
data_long %>% pivot_wider( id_cols = c(ID, time), names_from = rater, values_from = starts_with("v") )
内容的提问来源于stack exchange,提问作者itpetersen
相关产品推荐
相关产品推荐

