我有这样的数据集:
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)
}
答案 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)