将多个不同名称的列绑定为一个具有相同列名的列

问题描述 投票:0回答:1

在下面的数据框中,我想堆叠具有不同名称的三列(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)

r join dplyr merge bind
1个回答
2
投票

使用

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
© www.soinside.com 2019 - 2024. All rights reserved.