删除选择集的所有行,其中在 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"))
结合使用ave
和any
(借用@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]
我正在努力处理数据管理所需的一些代码。我提前道歉,因为我确信它有一个非常简单的解决方案,但我在其他地方找不到任何信息。
我正在使用 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"))
结合使用ave
和any
(借用@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]