2016-12-06 145 views
1

我有一個這樣的數據集(拆分與多個值與二進制值多colums單列):重塑數據

id value1 value2 
1 A  True 
2 B  False 
3 A  True 
4 C  True 

我希望找出多個值的列,並將其轉換爲多列與真或假值。結果將是:

id value1.A value1.B value1.C value2 
1  True  False False True 
2  False True False False 
3  True  False False True 
4  False True False True 

我不知道如何使用dcast爲此。我自己寫了一個函數,但它太慢了。它的代碼是在這裏:

to_multiple_columns <- function(col,attr_name){ 
elements <- names(table(col)) 
drops <- c("","True","False") 
elements <- elements[ !elements %in% drops] 
new_df <- data.frame(col) # to define data frame with nrows,ncols 
if(length(elements) > 0){ 
new_attr_names <- paste(attr_name,elements,sep = ".") 
    for(j in 1:length(new_attr_names)){ 
     new_df <- data.frame(new_df,grepl(elements[j],col)) 
    } 
    drops <- c("col") #drop original col 
    new_df <- new_df[,!(names(new_df) %in% drops)] 
    names(new_df) <- new_attr_names 
    } 
    return(new_df) 
} 

回答

2

您可以使用tidyr這樣的:

library(dplyr) 
library(tidyr) 
df %>% 
    mutate(value = TRUE) %>% 
    spread(value1, value, fill = FALSE, sep = '.') 

輸出:

id value2 value1.A value1.B value1.C 
1 1 True  TRUE FALSE FALSE 
2 2 False FALSE  TRUE FALSE 
3 3 True  TRUE FALSE FALSE 
4 4 True FALSE FALSE  TRUE 
+0

這是簡單的使用tidyverse的。 NA用填充代替。 – Bhail

0

在基礎R,您可以使用xtabs

如果不是value1中的所有元素都出現,則可以將其轉換爲factor

data.raw <- "id value1 value2 
1 A  True 
2 B  False 
3 A  True 
4 C  True" 

data <- read.table(textConnection(data.raw), header = T) 

data$value2 <- data$value2 == "True" 

xtabs(value2 ~ id + value1, data = data) 
#> value1 
#> id A B C 
#> 1 1 0 0 
#> 2 0 0 0 
#> 3 1 0 0 
#> 4 0 0 1 

對於大數據,您還可以生成一個稀疏矩陣。

xtabs(value2 ~ id + value1, data = data, sparse = T) 
2

我們可以使用dcast

library(data.table) 
dcast(setDT(df1)[, value:=TRUE], id+value2~value1, value.var="value", fill = FALSE) 
# id value2  A  B  C 
#1: 1 True TRUE FALSE FALSE 
#2: 2 False FALSE TRUE FALSE 
#3: 3 True TRUE FALSE FALSE 
#4: 4 True FALSE FALSE TRUE