首页 > 解决方案 > 将列拆分为几个变量并将相应的值移动到新列

问题描述

我有一个这样的数据框(有更多行):

   id act_l_n pas_l_n act_q_p pas_q_p act_l_p pas_l_p act_q_n pas_q_n
    1      14       8      14      10      21      11      21      11
    2      19       9      11      17      22      11      20      11

每个列名都包含有关以“_”分隔的 3 个变量的信息(每个都有 2 个级别,分别名为 act/pas、l/q、n/p)。值是对应于每个变量组合的分数(即 8 个条件中的 1 个)。

我需要将 3 个变量移动到 3 个单独的列,用数字标记它们的级别,并将相应的值移动到名为“score”的单独列。所以从当前数据框的第一行我会得到这样的东西:

id  score   actpas lq   pn
1   14       1     1    1
1   8        2     1    1
1   14       1     2    2
1   10       2     2    2
1   21       1     1    2
1   11       2     1    2
1   21       1     2    1
1   11       2     2    1

我已经尝试使用 dplyr 使用收集和分离功能来解决这个问题,但我无法真正得到我需要的东西。对 dplyr 的帮助将是最受重视的!

标签: rdplyr

解决方案


如果我理解得很好:

df<-read.table(textConnection(
"id,act_l_n,pas_l_n,act_q_p,pas_q_p,act_l_p,pas_l_p,act_q_n,pas_q_n
1,14,8,14,10,21,11,21,11
2,19,9,11,17,22,11,20,11"),
header=TRUE,sep=",")

library(tidyr)
library(dplyr)
gather(df,k,score,-id) %>% mutate(v1=1+as.integer(substr(k,1,3)=="pas")
                                 ,v2=1+as.integer(substr(k,5,5)=="q")
                                 ,v3=1+as.integer(substr(k,7,7)=="p")) %>%
  select(-2) %>% arrange(id)
#   id score v1 v2 v3
#1   1    14  1  1  1
#2   1     8  2  1  1
#3   1    14  1  2  2
#4   1    10  2  2  2
#5   1    21  1  1  2
#6   1    11  2  1  2
#7   1    21  1  2  1
#8   1    11  2  2  1
#9   2    19  1  1  1
#10  2     9  2  1  1
#11  2    11  1  2  2
#12  2    17  2  2  2
#13  2    22  1  1  2
#14  2    11  2  1  2
#15  2    20  1  2  1
#16  2    11  2  2  1

推荐阅读