我有一个像这样组织的data.frame:
id question input
1 11 1 6
2 12 1 7
3 13 1 5
4 14 2 5
5 15 2 6
6 16 3 4
7 17 4 5
8 18 4 5
9 19 4 4
10 20 5 3
我需要将“问题”列变成一系列列(一个用于问题1,一个用于问题2,等等),这没关系 - 我已经在网上找到了答案。
但是,我还需要使用'input'中的相应值填充这些新列,因此生成的data.frame如下所示:
id question input q1 q2 q3 q4 q5
1 11 1 6 6 NA NA NA NA
2 12 1 7 7 NA NA NA NA
3 13 1 5 5 NA NA NA NA
4 14 2 5 NA 5 NA NA NA
5 15 2 6 NA 6 NA NA NA
6 16 3 4 NA NA 4 NA NA
7 17 4 5 NA NA NA 5 NA
8 18 4 5 NA NA NA 5 NA
9 19 4 4 NA NA NA 4 NA
10 30 5 3 NA NA NA NA 3
从开始到结束,我将如何重塑这样的数据?我仍然是一名初学者,非常感谢任何帮助!
答案 0 :(得分:5)
您可以使用“reshape2”软件包中的dcast
,如下所示:
dcast(mydf, id + question + input ~ question, value.var = "input")
# id question input 1 2 3 4 5
# 1 11 1 6 6 NA NA NA NA
# 2 12 1 7 7 NA NA NA NA
# 3 13 1 5 5 NA NA NA NA
# 4 14 2 5 NA 5 NA NA NA
# 5 15 2 6 NA 6 NA NA NA
# 6 16 3 4 NA NA 4 NA NA
# 7 17 4 5 NA NA NA 5 NA
# 8 18 4 5 NA NA NA 5 NA
# 9 19 4 4 NA NA NA 4 NA
# 10 20 5 3 NA NA NA NA 3
答案 1 :(得分:4)
如果dat
是数据集
fun1 <- function(data){
m1 <- matrix(ncol=length(unique(data$question)), nrow=nrow(data))
m1[cbind(1:nrow(data), data$question)] <- data$input
res <- cbind(data, m1)
colnames(res)[-(1:3)] <- paste0("q", colnames(res)[-(1:3)])
res
}
fun1(dat)
# id question input q1 q2 q3 q4 q5
#1 11 1 6 6 NA NA NA NA
#2 12 1 7 7 NA NA NA NA
#3 13 1 5 5 NA NA NA NA
#4 14 2 5 NA 5 NA NA NA
#5 15 2 6 NA 6 NA NA NA
#6 16 3 4 NA NA 4 NA NA
#7 17 4 5 NA NA NA 5 NA
#8 18 4 5 NA NA NA 5 NA
#9 19 4 4 NA NA NA 4 NA
#10 20 5 3 NA NA NA NA 3
或使用dplyr
library(dplyr)
library(tidyr)
dat %>%
mutate(question1=question) %>%
spread(question1, input)