【问题标题】:In R: How do I turn factors into columns AND populate those columns with their corresponding values from another column?在 R 中:如何将因子转换为列并使用另一列中的相应值填充这些列?
【发布时间】:2014-08-12 15:10:07
【问题描述】:

我有一个这样组织的 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,等等),这没关系 - 我已经在网上找到了答案。

但是,我还需要使用“输入”中的相应值填充这些新列,因此生成的 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

我将如何从头到尾重塑这样的数据?我仍然是一个初学者,如果有任何帮助,我将不胜感激!

【问题讨论】:

    标签: r dataframe reshape


    【解决方案1】:

    您可以使用“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
    

    【讨论】:

      【解决方案2】:

      如果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)
      

      【讨论】:

      • +1。 只是 即将用几乎相同的东西更新我的答案。好的旧矩阵索引......
      • @Ananda Mahto。我没想到dcast。不过,你的更优雅。 +1
      • 我其实不同意。你的基本上归结为一个非常简单但非常有效的操作。我想这取决于what is meant by elegant code....
      猜你喜欢
      • 2020-02-05
      • 2020-08-31
      • 2018-07-24
      • 2020-12-13
      • 1970-01-01
      • 1970-01-01
      • 2020-06-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多