在R中:如何将因子转换为列并使用其他列中的相应值填充这些列?

时间:2014-08-12 15:10:08

标签: r dataframe reshape

我有一个像这样组织的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

从开始到结束,我将如何重塑这样的数据?我仍然是一名初学者,非常感谢任何帮助!

2 个答案:

答案 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)