r语言 - 如果行满足特定的列标准,如何将数据帧值重新编码为NA



我想将行转换为"如果特定列中的所有行都满足条件,在本例中,某些列中的行为"0";。

我有一个包含数百列的数据框架,但只关心一行在五列中是否都是&;0&;,然后我希望行在这些列中为&;na&;。

一开始我试着这样写:

surveyclean$Col1[surveyclean$Col1 == 0 & 
surveyclean$Col2 == 0 &
surveyclean$Col3 == 0 & surveyclean$Col4 == 0 &
surveyclean$Col5 == 0] <-NA

它适用于Col1,但是当我尝试对下一列进行相同操作时,它不起作用,因为Col1现在是"NA"。我可以使用什么代码来确保它在同一时间完成?

我正在处理一个更大的数据帧的五列:

surveyclean

> Col1        Col2      Col3       Col4   Col5
> 0           0          0          0      0
> 1           0          0          0      0
> 0           0          0          0      0
> 0           1          0          0      0
> 0           0          0          0      0
> 0           1          0          0      0

应该是什么样子:

> Col1        Col2      Col3       Col4   Col5
> NA          NA         NA         NA     NA
> 1           0          0          0      0
> NA          NA         NA         NA     NA
> 0           1          0          0      0
> NA          NA         NA         NA     NA
> 0           1          0          0      0

这里使用acrossc_across的方法,因此我可以按行检查,然后应用于列。

数据
structure(list(Col1 = c(0L, 1L, 0L, 0L, 0L, 0L), Col2 = c(0L, 
0L, 0L, 1L, 0L, 1L), Col3 = c(0L, 0L, 0L, 0L, 0L, 0L), Col4 = c(0L, 
0L, 0L, 0L, 0L, 0L), Col5 = c(0L, 0L, 0L, 0L, 0L, 0L)), class = "data.frame", row.names = c(NA, 
-6L))

代码
library(dplyr)
data %>% 
rowwise() %>% 
mutate(
across(
.cols = Col1:Col5,
.fns = ~ifelse(all(c_across(cols = Col1:Col5) == 0),NA,.)
)
)  %>% 
ungroup()

输出
# A tibble: 6 x 5
Col1  Col2  Col3  Col4  Col5
<dbl> <dbl> <dbl> <dbl> <dbl>
1    NA    NA    NA    NA    NA
2     1     0     0     0     0
3    NA    NA    NA    NA    NA
4     0     1     0     0     0
5    NA    NA    NA    NA    NA
6     0     1     0     0     0

相关内容

最新更新