【问题标题】:How to filter columns with ONLY specific values in R?如何过滤R中只有特定值的列?
【发布时间】:2020-03-16 21:43:17
【问题描述】:

我有一个数据集,其中包含一些虚拟变量,这些变量被编码为 1 和 2,而不是 1 和 0。数据集很大,但我想识别只有 1、2 和 NA 的所有列,以将它们更改为 1 和 0。 我用了 df %>% filter_all(any_vars(. %in% c('1', '2'))) 但是有些变量也用 1 到 5 的数字编码(甚至更多),所以我希望它们从转换中删除。

【问题讨论】:

  • 是这个字符值,它只能有 1、2 或 NA 值
  • @mariusagm 如果您能提供一个“可重现”的问题,那将非常有帮助。通过提供一个小的虚拟数据表,它允许其他人使用您显示的代码重现您的答案(错误或正确)。否则每个人都在黑暗中开枪,没有共同的讨论点。

标签: r filter dplyr dummy-variable


【解决方案1】:

如果我们需要更改这些列,可以使用mutate_all

library(dplyr)
df2 <- df1 %>%
         mutate_if(is.numeric, ~
          if(length(setdiff(unique(na.omit(.)), c(1, 2))) ==0) .-1 else .)
df2
#   col1 col2 grp       col3 col4
#1    1    0   a -0.5458808    5
#2    2    1   b  0.5365853    7
#3    3   NA   c  0.4196231    1
#4    4    0   d -0.5836272    2
#5    5    1   e  0.8474600    3

对于选择列,select 或select_if 比filter 更有用,因为filter 用于过滤行而不是列

df1 %>%
     select_if(~ length(setdiff(unique(na.omit(.)), c(1, 2))) ==0)
#  col2
#1    1
#2    2
#3   NA
#4    1
#5    2

数据

set.seed(24)
df1 <- data.frame(col1 = 1:5, col2 = rep(c(1:2, NA), length.out = 5),
       grp = letters[1:5], col3 = rnorm(5), col4 = c(5, 7, 1, 2, 3) )

【讨论】:

    【解决方案2】:

    假设您希望将 1 保留为 1 并将 2 保留为 0,我们可以使用 mutate_if 仅选择具有值 1、2 或 NA 的列并更改它们。

    library(dplyr)
    df %>% mutate_if(~all(. %in% c(1, 2, NA)), ~as.integer(. == 1))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-29
      • 2023-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-02
      • 1970-01-01
      相关资源
      最近更新 更多