删除选择集的所有行,其中在 R 中没有选择其他选择

Deleting all rows of a choice set where no alternative is chosen in R

我正在努力处理数据管理所需的一些代码。我提前道歉,因为我确信它有一个非常简单的解决方案,但我在其他地方找不到任何信息。

我正在使用 R 中的 mlogit 命令分析长格式数据。对于每个选择集,应该选择一个备选方案;否则 mlogit 命令失败并出现以下错误:

Error in if (abs(x - oldx) < ftol) { : 
missing value where TRUE/FALSE needed

对于我的数据集,确实有一些选择集没有被选择。因此,我的问题是:如何删除没有选择备选方案的选择集中的所有行? 在这个例子中,我希望删除 ID 2 的所有行,因为这个受访者没有做出选择:

即选择变量的值总是"FALSE"。

非常感谢任何帮助!

给你:

library(dplyr)
df <- df %>% group_by(ID) %>% mutate(sum = sum(CHOICE))
df <- df[df$sum != 0 , ]

或者,使用 dplyr 的 filter 函数:

df %>% group_by(ID) %>% filter(any(CHOICE))

数据:

df <- data.frame(ID = c(1,1,1,2,2,2,3,3,3,3),
                 CHOICE = c(F,T,F,F,F,F,T,F,F,F),
                 ALT = c("TRAIN", "CAR", "BUS","TRAIN", "CAR", "BUS","TRAIN", "CAR", "BUS","BIKE"))

结合使用aveany(借用@Richo的df):

df[ave(df$CHOICE, df$ID, FUN=any),]
#   ID CHOICE   ALT
#1   1  FALSE TRAIN
#2   1   TRUE   CAR
#3   1  FALSE   BUS
#7   3   TRUE TRAIN
#8   3  FALSE   CAR
#9   3  FALSE   BUS
#10  3  FALSE  BIKE

data.table 的一种方法(使用@Richo 的df)。我们将 'data.frame' 转换为 'data.table' (setDT(df)),按 'ID' 分组,我们得到 Data.table (.SD) 的子集。

library(data.table)
setDT(df)[, if(any(CHOICE)) .SD, by = ID]
#    ID CHOICE   ALT
#1:  1  FALSE TRAIN
#2:  1   TRUE   CAR
#3:  1  FALSE   BUS
#4:  3   TRUE TRAIN
#5:  3  FALSE   CAR
#6:  3  FALSE   BUS
#7:  3  FALSE  BIKE

或如@docendodiscimus 所述

setDT(df)[, .SD[any(CHOICE)], by = ID]

一个更快的选择可能是使用 .I 获取行索引然后提取行

setDT(df)[df[, .I[any(CHOICE)], by = ID]$V1]