r - 将列拆分为几个变量并将相应的值移动到新列
问题描述
我有一个这样的数据框(有更多行):
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 的帮助将是最受重视的!
解决方案
如果我理解得很好:
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
推荐阅读
- html - 无法在网站上移动背景图片
- video-streaming - 实时直播的最佳策略是什么
- jquery - 在智能向导中使用自定义验证?
- sass - 如何使用 Antd / Less 和 Sass / CSS 模块配置 Next.js
- c++ - 如何在 C++ 中将结构初始化为 0
- python - 在将权重归一化为 1 的数据框中插入新列时 Python 中的 SettingWithCopyWarning 错误
- vb.net - 下载,获取文件名并执行文件
- powershell - Powershell 中的 Vstest.console 和基于结果的操作
- azure-data-factory-2 - Azure 数据工厂 2:如何将文件拆分为多个输出文件
- retrofit - 如何在改造中发送 GET 请求?(它给出错误)