Как использовать применить для разных переменных - PullRequest
1 голос
/ 18 марта 2019

У меня есть три переменные с именами, которые мне нужно превратить в матрицу единиц и нулей, со столбцами для каждого имени и в которых единица означает, что имя появилось где-то в пяти переменных, а ноль - нет. Примерно так:

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 голосов
/ 18 марта 2019

Вы можете использовать приведенный ниже код для достижения этого -

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
0 голосов
/ 18 марта 2019

Одна 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
0 голосов
/ 18 марта 2019
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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...