我如何在R中过滤具有相同条件的多列

时间:2018-07-25 19:44:32

标签: r

我有如下所述的数据集。我想过滤掉20到40之间的所有值,并将其应用于所有列:

a. 23,45,57,87
b. 34,45,23,25
c. 34,56,67,87

预期结果:

a. 23,0,0,0
b. 0,34,23,25
c. 34, 0, 0, 0

感谢您的帮助

3 个答案:

答案 0 :(得分:1)

可能是重复项。但是,我将继续提供答案,但是我知道这不是最理想的方法。

a <- c(23,45,57,87)
b <- c(34,45,23,25)
c <- c(34,56,67,87)
df <- data.frame(a,b,c)
df %>% mutate(a = replace(a, !a %in% 20:40, 0)) %>% mutate(b = replace(b, !b %in% 20:40, 0))%>% mutate(c = replace(c, !c %in% 20:40, 0))

这确实达到了目的,尽管它确实违反了DRY原理。

答案 1 :(得分:1)

使用mutate_all中的dplyr

library(dplyr)
mutate_all(df, funs(replace(., . < 20 | 40 < ., 0)))

结果:

  V1 V2 V3 V4
1 23  0  0  0
2 34  0 23 25
3 34  0  0  0

数据:

df <- structure(list(V1 = c(23, 34, 34), V2 = c(45, 45, 56), V3 = c(57, 
23, 67), V4 = c(87, 25, 87)), .Names = c("V1", "V2", "V3", "V4"
), row.names = c("a", "b", "c"), class = "data.frame")

答案 2 :(得分:-1)

一个base R选项将会

df[df < 20 | df > 40] <- 0

数据

df <- structure(list(a = c(23, 45, 57, 87), b = c(34, 45, 23, 25), 
 c = c(34, 56, 67, 87)), .Names = c("a", "b", "c"), row.names = c(NA, 
-4L), class = "data.frame")