我正在尝试使用像这样的数据框
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循环,提取每一行。然后我会检查列是否已经存在,如果不存在则会创建一个新列。我无法接近工作,我不确定如何做到这一点。
答案 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