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