【问题标题】:Taking variable names out of column and creating new columns in R从列中取出变量名并在 R 中创建新列
【发布时间】:2017-09-27 01:31:07
【问题描述】:

我正在尝试采用这样的数据框

    name        response
 1   Phil        Exam
 2   Terry       Test
 3   Simmon      Exam
 4   Brad        Quiz

把它变成这个

    name        response    Exam    Test   Quiz
   1 Phil        Exam        Exam  
   2 Terry       Test                Test
   3 Simmon      Exam        Exam
   4 Brad        Quiz                       Quiz

我尝试使用 for 循环提取每一行。然后我会检查该列是否已经存在,如果不存在,它将创建一个新列。我无法接近工作,并且不确定如何做到这一点。

【问题讨论】:

  • 本质上是一个模型矩阵 - cbind(dat, model.matrix(~ response + 0, data=dat))

标签: r dataframe


【解决方案1】:

这可以通过几种方式完成。可能是了解 tidyverse 的好机会:

library(tidyverse)
new.df <- spread(old.df, response, response)

这是tidyr::spread() 的不寻常用法。在这种情况下,它从“response”中的值构造新的列名,并用“response”中的值填充这些列。 fill 参数可用于更改生成的空白单元格中的内容。

【讨论】:

  • 我正准备发布相同的内容。很高兴我精神焕发。
  • @rss1080 如果可行,请接受此帖子作为答案。
  • 你会不会碰巧有一个可以合并传播变量的方法?例如,如果我在不同的列上再次运行spread,并且该不同的列也包含考试,那么考试将被排序到之前制作的考试列中?
【解决方案2】:

基础 R 解决方案。我们可以创建一个函数来替换与目标词不匹配的词,然后为数据框创建新列。

# Create example data frame
dt <- read.table(text = "    name        response
 1   Phil        Exam
 2   Terry       Test
 3   Simmon      Exam
 4   Brad        Quiz", 
                 header = TRUE, stringsAsFactors = FALSE)

# A function to create a new column based on the word in response
create_Col <- function(word, df, fill = NA){
  new <- df$response
  new[!new == word] <- fill
  return(new)
} 

# Apply this function
for (i in unique(dt$response)){
  dt[[i]] <- create_Col(word = i, df = dt)
}

dt
    name response Exam Test Quiz
1   Phil     Exam Exam <NA> <NA>
2  Terry     Test <NA> Test <NA>
3 Simmon     Exam Exam <NA> <NA>
4   Brad     Quiz <NA> <NA> Quiz

【讨论】:

    【解决方案3】:

    我们可以使用dcast

    library(data.table)
    dcast(setDT(df1), name + response ~ response, value.var = 'response', fill = "")
    #     name response Exam Quiz Test
    #1:   Brad     Quiz      Quiz     
    #2:   Phil     Exam Exam          
    #3: Simmon     Exam Exam          
    #4:  Terry     Test           Test
    

    【讨论】:

      猜你喜欢
      • 2021-12-27
      • 2015-11-15
      • 2014-09-29
      • 1970-01-01
      • 2020-07-21
      • 1970-01-01
      • 1970-01-01
      • 2015-08-11
      • 2019-09-11
      相关资源
      最近更新 更多