2016-12-06 105 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