如何使用申请不同的变量

时间:2019-03-18 19:48:29

标签: r

我有三个变量,它们的名称需要转换成一个由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)),但我不知道如何对所有名称和所有变量执行此操作。

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

您可以使用下面的代码来实现这一目标-

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

答案 2 :(得分:0)

一种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     0