如何在多列的小写值上对数据框进行子集化

时间:2019-12-09 16:30:54

标签: r subset

我有一个这样的数据框:

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

但是,如果您有许多列(更多)并且容易出错,那么这样做是不经济的。是否有更清洁,更简单,更经济的方法,最好在基数R中使用?

3 个答案:

答案 0 :(得分:7)

var table = document.getElementsByTagName("TABLE");
var div = document.getElementById('tablediv');
div.innerHTML += table;

答案 1 :(得分:6)

一个选择是在grepl的每一列上应用lapply,以创建逻辑list的{​​{1}},并用{{1}创建vector }

Reduce

或使用|

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

答案 2 :(得分:2)

您可以每行使用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)),]