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

R 如何将离散选择数据转换为二进制指标,r,set,R,Set,我有一些离散选择数据,我想尝试使用该软件包,但不知道如何将数据转换为可用的形式,这似乎需要一组二进制变量来进行所有可能的选择 它由4591个关于8个选择集的观察组成,c1:c8,在子集{1,2,3},{4,5},{6,7}。。。{19,20}. data.framedoors看起来像这样,可以在这里找到 我想这正是你想要的。使用apply查找每行中的特定数字;您将其包装在对lappy的调用中,该调用通过从1到20的序列进行迭代;您可以使用Reduce(cbind)和as.data.frame将

我有一些离散选择数据,我想尝试使用该软件包,但不知道如何将数据转换为可用的形式,这似乎需要一组二进制变量来进行所有可能的选择

它由4591个关于8个选择集的观察组成,
c1:c8
,在子集{1,2,3},{4,5},{6,7}。。。{19,20}. data.frame
doors
看起来像这样,可以在这里找到


我想这正是你想要的。使用
apply
查找每行中的特定数字;您将其包装在对
lappy
的调用中,该调用通过从1到20的序列进行迭代;您可以使用
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))

除了我的
doors
数据也有一个日期列之外,这或多或少是可行的,因此我在
dd上使用了这个选项。在这种情况下,您不需要
doors[,1:8]
部分,因为值1:20不会出现在日期列的任何位置。但是,是的,将操作限制在相关列可能仍然是一个好主意。
> 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
>
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))
> head(df)
    d1 d2 d3 d4 d5 d6 d7 d8 d9 d10 d11 d12 d13 d14 d15 d16 d17 d18 d19 d20
758  0  1  0  0  0  0  0  0  0   0   1   0   0   1   0   1   0   0   1   0
759  0  1  0  0  0  0  0  0  0   0   1   0   0   1   0   1   0   0   1   0
760  0  1  0  0  0  0  0  0  0   0   1   0   0   0   1   1   0   0   1   0
761  0  1  0  0  0  0  0  0  0   0   1   0   0   1   0   1   0   0   1   0
762  0  0  1  0  0  0  0  0  0   0   0   0   1   1   0   1   0   0   1   0
763  0  0  1  0  0  0  0  0  0   0   0   0   1   0   1   1   0   0   0   1