如何将特定列中的所有 NA 重命名为 0,然后在整个数据帧中删除这些行(0s)?

How to Rename all NAs in specific column as a 0 and then drop those rows (0s) across entire dataframe?

提问人:Questions 提问时间:11/15/2023 最后编辑:M.VikingQuestions 更新时间:11/16/2023 访问量:40

问:

我有一个包含 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
r 数据帧

评论

0赞 GuedesBF 11/15/2023
“从列中删除 0 和 NA”和“删除这些 0 和 NA 的行”是什么意思?您的意思是过滤掉特定列的带有 0 或 NA 的行吗?
0赞 GuedesBF 11/15/2023
您可以直接过滤掉 NA,无需转换为 0 作为中间步骤。用df_2[!is.na(df_2$q1),]
0赞 Gregor Thomas 11/15/2023
如果您分享一个示例输入和所需输出的小示例,情况会更清楚。也许像这样的东西 你想要的输出会是什么 用那个输入?(不要在评论中回复 - 将示例和所需结果编辑到您的问题中。df1 = data.frame(a = 1:5, b = c(0, NA, 3, 4, 5), c = c(1, 0, NA, 4, 0))

答:

0赞 Gregor Thomas 11/16/2023 #1

您可以删除所有包含或包含以下内容的行:NA0col1

df_2 = df_1[!df_1$col1 %in% c(NA, 0), ]

或者,如果您愿意dplyr

library(dplyr)
df_2 = df_1 |> filter(!col1 %in% c(NA, 0))

如果您更愿意采用转换为 0 然后删除 0 的两步方法,以下是基本选项和选项:NA0dplyr

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