【问题标题】:How to subset dataframe on lowercase values in multiple columns如何对多列中小写值的数据框进行子集化
【发布时间】:2019-12-09 16:30:54
【问题描述】:

我有一个这样的数据框:

set.seed(12)
df <- data.frame(
  v1 = sample(LETTERS, 10),
  v2 = sample(LETTERS, 10),
  v3 = sample(LETTERS, 10),
  v4 = c(sample(LETTERS, 8), sample(letters, 2)),
  v5 = c(sample(letters, 1), sample(LETTERS, 7), sample(letters, 2))
    )
df
   v1 v2 v3 v4 v5
1   B  K  F  G  p
2   U  U  T  W  N
3   W  J  C  V  Y
4   G  I  Q  S  E
5   D  F  E  N  T
6   A  X  Z  T  C
7   V  Y  K  X  I
8   M  Z  D  Q  A
9   Y  L  H  k  d
10  R  B  L  j  t

我想在df 的任何列中包含小写值的那些行上对df 进行子集化。 可以这样做:

df1 <- df[grepl("[a-z]", df$v1) | grepl("[a-z]", df$v2) | grepl("[a-z]", df$v3) |
          grepl("[a-z]", df$v4) | grepl("[a-z]", df$v5), ]
df1
   v1 v2 v3 v4 v5
1   B  K  F  G  p
9   Y  L  H  k  d
10  R  B  L  j  t

但是,如果您有很多(更多)列,并且容易出错,这是不经济的。有没有更干净、更简单、更经济的方法,最好是在base R中?

【问题讨论】:

    标签: r subset


    【解决方案1】:
    df[rowSums(sapply(df, function(x) x %in% letters)) > 0,]
    #OR
    df[apply(df == sapply(df, tolower), 1, any),]
    #   v1 v2 v3 v4 v5
    #1   B  L  L  M  e
    #9   R  N  D  t  t
    #10  F  X  M  h  x
    

    【讨论】:

      【解决方案2】:

      一种选择是使用lapply 在每一列上应用grepl 以创建逻辑vectors 和Reducelist|

      df[Reduce(`|`, lapply(df, grepl, pattern = "[a-z]")),]
      #   v1 v2 v3 v4 v5
      #1   B  L  L  M  e
      #9   R  N  D  t  t
      #10  F  X  M  h  x
      

      或使用filter_all

      library(dplyr)
      library(stringr)
      df %>% 
          filter_all(any_vars(str_detect(., "[a-z]")))
      #  v1 v2 v3 v4 v5
      #1  B  L  L  M  e
      #2  R  N  D  t  t
      #3  F  X  M  h  x
      

      【讨论】:

      • 很酷。 Reduce 对我来说是新功能:为什么 | 包含在反引号中?
      • @ChrisRuehlemann 只是为了正确评估它。它也可以使用单引号
      【解决方案3】:

      您可以每行使用paste,然后使用grepl

      df[grepl("[a-z]", apply(df, 1, paste, collapse="")),]
      #   v1 v2 v3 v4 v5
      #1   B  L  L  M  e
      #9   R  N  D  t  t
      #10  F  X  M  h  x
      

      或者另一个选项是do.call

      df[grepl("[a-z]", do.call(paste, df)),]
      

      【讨论】:

      • 那更酷:虽然我明白paste, collapse="",但不确定--它有什么作用?
      • paste 获得一个向量,并与collapse 连接。试试paste(c("a", "b"))paste(c("a", "b"), collapse="")
      • 因此此处的粘贴垂直起作用,通过将满足greplclause 中表达的条件的行绑定在一起?
      • 不行它horizo​​ntal,用apply中的1定义。
      • @akrun 感谢改进!
      猜你喜欢
      • 1970-01-01
      • 2013-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-10
      • 1970-01-01
      相关资源
      最近更新 更多