在R(tidyverse)中匹配并重新排序多列数据行
解决方案
可以用dplyr的across()函数批量处理所有以subj开头的列,完美嵌入管道操作:
library(dplyr) data = tibble(item = 1:10, subj01 = c(1,2,5,9,10,NA,NA,NA,NA,NA), subj02 = c(1,2,5,6,8,9,10,NA,NA,NA), subj03 = c(1,6,9,NA,NA,NA,NA,NA,NA,NA)) # 核心处理代码 processed_data <- data %>% mutate(across(starts_with("subj"), ~ .x[match(item, .x)])) processed_data
代码解释
starts_with("subj"):匹配所有以subj开头的列,自动适配你实际数据中更多的同类列~ .x[match(item, .x)]:对每一列(用.x指代当前处理的列)执行你已掌握的单列匹配逻辑,match(item, .x)会找到每个item值在当前列中的位置,再用这个位置重新索引当前列- 之前报错是因为没有用
across()批量迭代列,直接在mutate里用自定义变量名无法被dplyr识别
输出结果
执行后得到的目标数据集如下:
# A tibble: 10 × 4 item subj01 subj02 subj03 <int> <dbl> <dbl> <dbl> 1 1 1 1 1 2 2 2 2 NA 3 3 NA NA NA 4 4 NA NA NA 5 5 5 5 NA 6 6 NA 6 6 7 7 NA NA NA 8 8 NA 8 NA 9 9 9 NA 9 10 10 10 10 NA
内容的提问来源于stack exchange,提问作者kby
相关产品推荐
相关产品推荐

