【问题标题】:Selecting all columns that have some specific values选择具有某些特定值的所有列
【发布时间】:2021-04-30 13:47:54
【问题描述】:

我有一个超过 50 列和 10,000 行的 data.frame 我想选择其中包含 0 或 1 的那些列,不包括这些列中的其他值a

示例data.frame如下:

dummy_df <- data.frame(
                        id=1:4,
                        gender=c(4,1,0,1),
                        height=seq(150, 180,by = 10),
                        smoking=c(3,0,1,0)
                       )

我想选择所有具有 0 或 1 值的列,并排除其他值,例如性别 4 和吸烟 3 以及如下所示

  gender  smoking
    1         0
    0         1
    1         0

但我在实际数据框中有 50 列,我不知道它们中的哪一列有 0 或 1

我正在尝试的是:

 dummy_df %>% select_if(~ all(  . %in% 0:1))

【问题讨论】:

  • 你能澄清你想要做什么吗?您的代码正确地返回了一个空数据集,因为示例数据集中的所有列都只包含 0 或 1 的值。
  • @Lief Esbenshade 我正在尝试选择所有值为 0 或 1 的列,并在性别和吸烟等列中排除 0 或 1 以外的值,其值为 4 和 3,这应该被排除在这些列中我只想要 0 或 1。

标签: r


【解决方案1】:

这对你有用吗?

dummy_df %>% 
  select(- c(id, height)) %>%
  rowwise() %>% 
  filter(any(c_across() == 0)|any(c_across() == 1))
# A tibble: 3 x 2
# Rowwise: 
  gender smoking
   <dbl>   <dbl>
1      1       0
2      0       1
3      1       0

编辑

如果您事先不知道哪些列包含0 和/或1,您可以在base R 中确定:

temp <- dummy_df[sapply(dummy_df, function(x) any(x == 0|x == 1))]

现在您可以过滤带有0和/或1的行:

temp %>% 
  rowwise() %>% 
  filter(any(c_across() == 0)|any(c_across() == 1))

【讨论】:

  • 谢谢,但在这种情况下,您选择除 id 和 height 之外的所有内容>% 过滤器(性别 %in% 0:1,吸烟 %in% 0:1)
【解决方案2】:

我觉得这更像是filter而不是select

library(dplyr)


dummy_df %>%
  filter(if_all(c(gender, smoking), ~ .x %in% c(0, 1)))


  id gender height smoking
1  2      1    160       0
2  3      0    170       1
3  4      1    180       0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-19
    • 2022-01-17
    • 2021-12-11
    • 1970-01-01
    • 1970-01-01
    • 2016-12-22
    • 1970-01-01
    • 2022-01-01
    相关资源
    最近更新 更多