我有三个变量的名称,我需要将它们转换为一个由1和0组成的矩阵,每个名称都有列,其中1表示名称出现在5个变量中的任何位置,0表示没有出现。如下所示:
Var1   Var2   Var3  
Name1  Name2  Name3
Name1  Name4  Name5
Name3  Name5  Name6
Name2  Name3  Name4我需要这样的东西
Name1 Name2 Name3 Name4 Name5 Name6
    1     1     1     0     0     0
    1     0     0     1     1     0
    0     0     1     0     1     1
    0     1     1     1     0     0如果是单个名称和单个变量,我会使用transform(data, Name1 = ifelse(Var1 == "Name1", 1, 0)),但我不知道如何对所有名称和所有变量执行此操作。
发布于 2019-03-19 03:54:41
nm = sort(unique(unlist(df1)))
data.frame(setNames(lapply(nm, function(x)
    rowSums(sapply(df1, function(d) as.numeric(d %in% x)))), nm))
#  Name1 Name2 Name3 Name4 Name5 Name6
#1     1     1     1     0     0     0
#2     1     0     0     1     1     0
#3     0     0     1     0     1     1
#4     0     1     1     1     0     0#DATA
df1 = structure(list(Var1 = c("Name1", "Name1", "Name3", "Name2"), 
                     Var2 = c("Name2", "Name4", "Name5", "Name3"),
                     Var3 = c("Name3", "Name5", "Name6", "Name4")),
                class = "data.frame", row.names = c(NA, -4L))发布于 2019-03-19 04:05:19
您可以使用以下代码来实现这一点-
data.table::setDT(df1)
df1 <- data.table::dcast(
    melt(df1[,rownm:=1:nrow(df1)], id.vars="rownm"), 
    rownm ~ value,
    length)
> df1[,-"rownm"]
   Name1 Name2 Name3 Name4 Name5 Name6
1:     1     1     1     0     0     0
2:     1     0     0     1     1     0
3:     0     0     1     0     1     1
4:     0     1     1     1     0     0发布于 2019-03-19 04:12:55
一种tidyverse的可能性可能是:
df %>%
 rowid_to_column() %>%
 gather(var, val, -rowid) %>%
 add_count(rowid, val) %>%
 select(-var) %>%
 spread(val, n, fill = 0) %>%
 ungroup %>%
 select(-rowid)
  Name1 Name2 Name3 Name4 Name5 Name6
  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1     1     1     1     0     0     0
2     1     0     0     1     1     0
3     0     0     1     0     1     1
4     0     1     1     1     0     0https://stackoverflow.com/questions/55229029
复制相似问题