从列中取出变量名并在R中创建新列

时间:2017-09-27 01:31:07

标签: r dataframe

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

    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循环,提取每一行。然后我会检查列是否已经存在,如果不存在则会创建一个新列。我无法接近工作,我不确定如何做到这一点。

3 个答案:

答案 0 :(得分:2)

这可以通过几种方式实现。可能是一个了解整齐的好机会:

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

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

答案 1 :(得分:0)

基础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

答案 2 :(得分:0)

我们可以使用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