如何将离散选择数据转换为二进制指标

时间:2016-11-04 20:32:10

标签: r set

我有一些离散的选择数据我想尝试使用upSetR包,但无法弄清楚如何将我的数据转换为可用的形式,这似乎需要一套所有可能选择的二进制变量。

它包含4591个关于8个选项c1:c8的集合的观察,在子集的元素中,{1,2,3},{4,5},{6,7},...... {19 ,20}。 data.frame doors看起来像这样,可以在这里找到[https://www.dropbox.com/s/8iffufkt3iz6guf/doors.csv?raw=1

> doors <- read.csv("https://www.dropbox.com/s/8iffufkt3iz6guf/doors.csv?raw=1", 
                     row.names=1, stringsAsFactors=FALSE)
> doors$date <- as.POSIXct(doors$date)

> doors[sample(1:nrow(doors), 15), 1:8 ]
     c1 c2 c3 c4 c5 c6 c7 c8
3038  2  4  6  9 11 14 16 20
2021  2  4  7 NA 11 14 16 20
3482  2  4  7  9 13 14 17 20
4779  2  4  6  9 11 14 16 19
3922  1 NA NA NA 11 15 NA NA
1726  2  5 NA NA 11 15 NA 20
4659  2  4  6  9 11 14 16 NA
1267  3  4  6  9 13 14 17 20
3916  2  5  7  9 13 14 16 19
5132  3  4  6  9 13 15 16 19
1846  2  4  6 NA 11 NA 16 20
1768  3  5  6 NA 13 14 16 20
3833  2  4  6 NA 13 14 16 19
1610  2  4  6  9 11 NA 16 19
4290  1  5  6 10 13 14 18 19
>

我想将c1:c8数据框中的doors转换为二进制变量d1:d20,其中每个 观察,d[i] = 1如果i包含在变量c1:c8中的任何位置。我怎么能这样做?

如果有助于理解这一点,下表显示了选择变量(我拥有的)和二进制变量(我想要的)之间的关系。

> tab <- table(stack(doors[,1:8]))
> names(dimnames(tab)) <- c("door", "choice")
> rownames(tab) <- paste0("d", 1:20)
> tab
     choice
door    c1   c2   c3   c4   c5   c6   c7   c8
  d1   382    0    0    0    0    0    0    0
  d2  2193    0    0    0    0    0    0    0
  d3  2016    0    0    0    0    0    0    0
  d4     0 2843    0    0    0    0    0    0
  d5     0 1155    0    0    0    0    0    0
  d6     0    0 2607    0    0    0    0    0
  d7     0    0 1349    0    0    0    0    0
  d8     0    0    0  654    0    0    0    0
  d9     0    0    0 2174    0    0    0    0
  d10    0    0    0  197    0    0    0    0
  d11    0    0    0    0 2093    0    0    0
  d12    0    0    0    0  367    0    0    0
  d13    0    0    0    0 1585    0    0    0
  d14    0    0    0    0    0 2449    0    0
  d15    0    0    0    0    0 1466    0    0
  d16    0    0    0    0    0    0 3004    0
  d17    0    0    0    0    0    0  354    0
  d18    0    0    0    0    0    0  591    0
  d19    0    0    0    0    0    0    0 1581
  d20    0    0    0    0    0    0    0 2092
>

1 个答案:

答案 0 :(得分:1)

我认为这就是你所追求的。您使用doctype html html(ng-app="myApp") head meta(charset="utf-8") meta(http-equiv="X-UA-Compatible", content="IE=edge") meta(name="viewport", content="width=device-width, initial-scale=1.0, maximum-scale=1.0") title= title link(rel='icon', type='image/png', href='favicon.ico') // bower:css link(rel='stylesheet', href='../bower_components/animate.css/animate.css') // endbower // - [FIX] removed: script(src='js/app.js') link(rel="stylesheet", href="css/app.css") link(href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet") body(ng-controller="AssignmentController") block content //- lib js // bower:js script(src='../bower_components/jquery/dist/jquery.js') script(src='../bower_components/angular/angular.js') script(src='../bower_components/Materialize/bin/materialize.js') script(src='../bower_components/angular-route/angular-route.js') script(src='../bower_components/angular-animate/angular-animate.js') script(src='../bower_components/angular-materialize/src/angular-materialize.js') // endbower //- app js script(src='js/app.js') script(src='js/controllers.js') script(src='js/services.js') script(src='js/directives.js') script(src='//localhost:35729/livereload.js') 查找每行中的特定数字;你把它包装在apply的调用中,它通过从1到20的顺序迭代它;您使用lapplyReduce(cbind)来拼写生成数据框的列表;然后你给那个数据框中的列提供了很好的名字。在调用as.data.frame时,您可以使用apply获取一个虚拟变量,指示值as.numeric(any(x == i))是否出现在该行的任何位置。

i

以下是结果的前几行:

df <- lapply(seq(20), function(i) apply(doors[,1:8], 1, function(x) as.numeric(any(x == i, na.rm = TRUE))))
df <- Reduce(cbind, df)
df <- as.data.frame(df)
names(df) <- paste0("d", seq(20))