R 重塑为具有多个值的长列
我知道在这个问题上有几个“重复”的线程,但我已经查看了它们,不知道如何让R 重塑为具有多个值的长列,r,R,我知道在这个问题上有几个“重复”的线程,但我已经查看了它们,不知道如何让重塑来做我想做的事情 我有一个数据集,参与者参加两个测试,每个测试有两个问题(即问题1测试1、问题2测试1、问题1测试2、问题2测试2)。他们可以将问题正确或错误。我已将测试1的答案更改为0和1,因此更容易看到问题 df <- read.table(header = T, text = " subj Q1.test1 Q2.test1 Q1.test2 Q2.test2 1 0 1
重塑
来做我想做的事情
我有一个数据集,参与者参加两个测试,每个测试有两个问题(即问题1测试1、问题2测试1、问题1测试2、问题2测试2)。他们可以将问题正确
或错误
。我已将测试1的答案更改为0
和1
,因此更容易看到问题
df <- read.table(header = T, text = "
subj Q1.test1 Q2.test1 Q1.test2 Q2.test2
1 0 1 right wrong
2 0 1 wrong wrong
")
然而,每当我尝试重新塑造它时,它不会产生我想要的数据帧
df.long <- reshape(df, direction = "long",
varying = c("Q1.test1", "Q2.test1", "Q1.test2", "Q2.test2"),
timevar = "question",
times = c("Q1", "Q2"),
v.names = c("test1", "test2"),
idvar = "subj")
df.long
subj question test1 test2
1 Q1 0 1
2 Q1 0 1
1 Q2 right wrong
2 Q2 wrong wrong
df.long以下是如何使用tidyr
软件包完成此操作。注意:创建数据框时请使用stringsAsFactors=FALSE
,否则会出现警告。我调用数据帧df1
collect
从宽转换为长,separate
将列名拆分为新列,并spread
为每个测试创建带有值的列
比较tidyr
和重塑
library(tidyr)
df1 %>%
gather(Var, Val, -subj) %>%
separate(Var, sep = "\\.", into = c("question", "test")) %>%
spread(test, Val)
结果:
subj question test1 test2
1 1 Q1 0 right
2 1 Q2 1 wrong
3 2 Q1 0 wrong
4 2 Q2 1 wrong
数据:
df1
subj question test1 test2
1 1 Q1 0 right
2 1 Q2 1 wrong
3 2 Q1 0 wrong
4 2 Q2 1 wrong
df1 <- read.table(header = TRUE,
text = "subj Q1.test1 Q2.test1 Q1.test2 Q2.test2
1 0 1 right wrong
2 0 1 wrong wrong",
stringsAsFactors = FALSE)