在下面的数据框中,我想堆叠具有不同名称的三列(s_psy01、l_psy01、r_psy01)并将其命名为psy01。其他两组列也是如此。我怎样才能最好地使用 dplyr 或通过其他方法来做到这一点。
nr=c(1:6)
s_psy01=c(NA,NA,NA,NA,4,5)
l_psy01=c(NA,NA,2,3,NA,NA)
r_psy01=c(2,5,NA,NA,NA,NA)
s_psy02=c(NA,NA,NA,NA,2,3)
l_psy02=c(NA,NA,5,2,NA,NA)
r_psy02=c(3,5,NA,NA,NA,NA)
s_psy03=c(NA,NA,NA,NA,2,4)
l_psy03=c(NA,NA,2,5,NA,NA)
r_psy03=c(1,3,NA,NA,NA,NA)
df <- data.frame(nr,s_psy01, l_psy01, r_psy01,
s_psy02, l_psy02, r_psy02,
s_psy03, l_psy03, r_psy03)
使用
pivot_longer
的一种方法 - 从 \\D+
中捕获非数字 (\\d+
) 和数字 ($
) 直到字符串的末尾 (_
) 作为 names_pattern
中的单个组对于.value
中指定的相应names_to
,将与子字符串后缀匹配的列值连接成长格式的单个列
library(tidyr)
pivot_longer(df,
cols =-nr, names_to = c("prefix", ".value"),
names_pattern = "(.*)_(\\D+\\d+)$", values_drop_na = TRUE)
-输出
# A tibble: 6 × 5
nr prefix psy01 psy02 psy03
<int> <chr> <dbl> <dbl> <dbl>
1 1 r 2 3 1
2 2 r 5 5 3
3 3 l 2 5 2
4 4 l 3 2 5
5 5 s 4 2 2
6 6 s 5 3 4