2017-09-27 36 views
0

我想採取一個數據幀像這樣以變量名柱而出的和R中

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

基本上是一個模型矩陣 - 'cbind(DAT,model.matrix(〜響應+ 0,數據= DAT))' – thelatemail

回答

2

這可以通過幾種方法完成。可能是一個很好的機會,結識了tidyverse:

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

這是一個不尋常的使用tidyr::spread()。在這種情況下,它會根據「響應」中的值構造新的列名稱,並使用「響應」中的值填充這些列。參數fill可用於更改生成的空白單元格中的內容。

+0

我在我的方式來發布一樣。很高興我刷新了。 –

+0

這工作非常好,謝謝! – rss1080

+0

@ rss1080如果這可行,請接受此帖作爲答案。 – www

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