我有一个<script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
<script src="https://canvasjs.com/assets/script/canvasjs.min.js"></script>
<div id="chartContainer" style="height: 360px; width: 100%;"></div>
,其中包含以下属性:
data.frame
我想为每个包含的id生成一个虚拟变量。结果应该是这样的。
list1 <- c(145540,145560, 157247, 145566)
list2 <- c(166927, NA, NA, NA)
list3 <- c(145592, 145560, 145566, NA)
df <- data.frame(list1, list2, list3)
任何想法如何实现这一目标?谢谢!
答案 0 :(得分:3)
只需使用stack
和table
:
t(table(stack(df)))
## values
## ind 145540 145560 145566 145592 157247 166927
## list1 1 1 1 0 1 0
## list2 0 0 0 0 0 1
## list3 0 1 1 1 0 0
或者,使用“data.table”:
library(data.table)
melt(as.data.table(df), measure.vars = names(df), na.rm = TRUE)[
, dcast(.SD, variable ~ value, fun = length)]
## variable 145540 145560 145566 145592 157247 166927
## 1: list1 1 1 1 0 1 0
## 2: list2 0 0 0 0 0 1
## 3: list3 0 1 1 1 0 0
或者使用“tidyverse”:
library(tidyverse)
df %>%
gather(var, col, everything(), na.rm = TRUE) %>%
mutate(val = 1) %>%
spread(col, val, fill = 0)
或者使用“qdapTools”:
mtabulate(df)
答案 1 :(得分:0)
您可以使用%in%
:
list %in% list1 + 0
# [1] 1 1 1 0 1 0
注意你在list1的答案中有一个拼写错误,因为145592不在list1中,但157247是。 + 0
将TRUE / FALSE转换为1/0。您可以使用sapply()
处理整个数据框:
t(sapply(df, function(x) list %in% x + 0))
# [,1] [,2] [,3] [,4] [,5] [,6]
# list1 1 1 1 0 1 0
# list2 0 0 0 0 0 1
# list3 0 1 1 1 0 0
答案 2 :(得分:0)
我的回答有点笨拙,但现在是:
all.vals <- na.omit(unique(unlist(df))) ## get full set of values
使用for
循环以获得更清晰:
df2 <- list()
for (i in seq_along(df))
df2[[i]] <-
sapply(all.vals,
function(x) as.numeric(x %in% df[[i]]))
names(df2) <- names(df)
## add labels as the first column:
df2 <- data.frame(all.vals,df2)
结果:
all.vals list1 list2 list3
1 145540 1 0 0
2 145560 1 0 1
3 157247 1 0 0
4 145566 1 0 1
5 166927 0 1 0
6 145592 0 0 1