我有一些离散的选择数据我想尝试使用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
>
答案 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的顺序迭代它;您使用lapply
和Reduce(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))