重塑R中的数据(将具有多个值的拆分单列拆分为具有二进制值的多个列)

时间:2016-12-06 00:20:49

标签: r dplyr reshape reshape2

我有这样的数据集:

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

我想识别一个具有多个值的列,并将其转换为R中具有True或False值的多个列。结果将是:

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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

答案 2 :(得分: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)