提问人:Questions 提问时间:11/15/2023 最后编辑:M.VikingQuestions 更新时间:11/16/2023 访问量:40
如何将特定列中的所有 NA 重命名为 0,然后在整个数据帧中删除这些行(0s)?
How to Rename all NAs in specific column as a 0 and then drop those rows (0s) across entire dataframe?
问:
我有一个包含 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 |
答:
0赞
Gregor Thomas
11/16/2023
#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))
如果您更愿意采用转换为 0 然后删除 0 的两步方法,以下是基本选项和选项:NA
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)
上一个:@Async测试异常用例
评论
df_2[!is.na(df_2$q1),]
df1 = data.frame(a = 1:5, b = c(0, NA, 3, 4, 5), c = c(1, 0, NA, 4, 0))