我有一个包含 298 个变量的 50,000 个 obs 的数据框,其中有一列计算调查中人员的年龄。我想排除所有回答 0(15 岁以下)和 NA 的人,因为我将查看数据集中与工资相关的列。如果我想将所有 NA 变为 0,然后从该列中删除所有 0(并从数据帧的其余部分中删除这些行),我该怎么做?
我尝试创建一个复制的数据帧(df_2),并将所有 NA 重命名为 0,然后使用以下命令删除它们:
df_2$q1 <- ifelse(is.na(df_1$q1), 0, df_1$q1)
df_2[df_2$q1 != 0, ]
但这不起作用
例如,这是我的开始数据框:
col1 | col2 | col3 | col4 | |
---|---|---|---|---|
r1 | 不适用 | 1 | 0 | 1 |
r2 | 0 | 1 | 1 | 1 |
r3 | 1 | 1 | 0 | 1 |
r4 | 1 | 0 | 1 | 1 |
r5 | 不适用 | 1 | 0 | 1 |
我想得到这个结果数据框:
col1 | col2 | col3 | col4 | |
---|---|---|---|---|
r1 | 1 | 1 | 0 | 1 |
r2 | 1 | 0 | 1 | 1 |
您可以使用
NA
或 0
中的 col1
删除所有行:
df_2 = df_1[!df_1$col1 %in% c(NA, 0), ]
或者如果您愿意的话
dplyr
library(dplyr)
df_2 = df_1 |> filter(!col1 %in% c(NA, 0))
如果您更愿意采用两步方法将
NA
转换为 0
,然后删除 0,这里有基本选项和 dplyr
选项:
## base
df_2 = df_1
df_2[is.na(df_2$col1), "col1"] = 0
df_2 = df_2[df_2$col1 != 0, ]
## dplyr
df_2 = df_1 |>
mutate(col1 = coalesce(col1, 0)) |> ## coalesce replaces NA values
filter(col1 != 0)