如果不是,则数据框中单个列的逻辑适用于所有列

时间:2019-04-22 08:07:21

标签: r

如果某些条件适用于单个列,那么该如何在数据帧中进行创建,则该数据帧的所有行将为Null。

例如,我有一个数据框。

A<- c(2,3,5,6,5,7,8,5)
B <- c("AB", "BC", "CD", "DE", "EF", "FG", "HI", "IJ")
C <- c("X", "Y", "Z", "W", "X", "Y", "Z", "W")
ABC <-data.frame(A,B,C)
> ABC
  A  B C
1 2 AB X
2 3 BC Y
3 5 CD Z
4 6 DE W
5 5 EF X
6 7 FG Y
7 8 HI Z
8 5 IJ W

我想让每个ABC$A等于5,那么所有与5连接的行将为NULL或NA。

我想要的输出应如下所示

> ABC
  A    B    C
1 2   AB    X
2 3   BC    Y
3 5 <NA> <NA>
4 6   DE    W
5 5 <NA> <NA>
6 7   FG    Y
7 8   HI    Z
8 5 <NA> <NA>

ifelse函数可以完成这项工作,但是如果我有很多列,该怎么办。我希望它适用于A以外的所有列。

2 个答案:

答案 0 :(得分:1)

您可以使用行/列子设置并将NA直接分配给所有列。

ABC[ABC$A == 5, -1] <- NA

ABC
#  A    B    C
#1 2   AB    X
#2 3   BC    Y
#3 5 <NA> <NA>
#4 6   DE    W
#5 5 <NA> <NA>
#6 7   FG    Y
#7 8   HI    Z
#8 5 <NA> <NA>

此处-1将忽略第一列A,因为我们不想更改该列中的任何值。


其他一些变体

ABC[-1] <- lapply(ABC[-1], function(x) replace(x, ABC$A == 5, NA))

并使用dplyr

library(dplyr)
ABC %>%  mutate_at(-1, ~replace(., A == 5, NA))

答案 1 :(得分:0)

我们可以使用na_if

library(dplyr)
ABC %>%
     mutate_at(-1, list(~ na_if(A, y = 5)))