【问题标题】:Deleting all rows of a choice set where no alternative is chosen in R删除选择集中的所有行,其中没有在 R 中选择替代项
【发布时间】:2026-01-23 14:05:02
【问题描述】:

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

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

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

对于我的数据集,确实有一些选择集没有选择替代方案。因此,我的问题是:如何删除未选择替代选项的选项集的所有行? 在此示例中,我希望删除 ID 2 的所有行,因为该受访者没有做出任何选择:

即,选择变量的值始终为“FALSE”。

非常感谢任何帮助!

【问题讨论】:

  • 请以最小的可重现形式提供问题,即,以便其他人可以轻松从您的帖子中复制并将其粘贴到他们的会话中并查看结果。必须提供所有库语句和输入,如果它们很大,则需要将它们缩减到仍能说明问题的最小尺寸。发布dput(whatever) 的输出(不是图像)以可重复地显示输入数据。有关如何提出问题的信息,请参阅 1) *.com/questions/5963269/… 2) *.com/help/mcve 3) *.com/help/how-to-ask

标签: r subset data-cleaning


【解决方案1】:

使用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]

【讨论】:

  • setDT(df)[, .SD[any(CHOICE)], by = ID]
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    给你:

    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"))
    

    【讨论】:

      最近更新 更多