从数据框生成虚拟变量

时间:2018-02-02 15:06:52

标签: r dataframe dummy-variable

我有一个<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)

任何想法如何实现这一目标?谢谢!

3 个答案:

答案 0 :(得分:3)

只需使用stacktable

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