是否有R函数来过滤保留所有匹配值的列的数据框?

时间:2019-02-18 19:24:41

标签: r dataframe

我有一个大数据框,其中有5行,但约有10万列。我想保留一列中所有值都匹配的列。

这是数据框的示例

> df
  Mouse JAX00000010 JAX00000010r UNCHS000003 JAX00240606 JAX00240613 JAX00240636 UNCHS000005
1   407          BF           BF          BF          BF          BF          BF          BF
2   410          BH           BH          BH          BH          BH          BH          BH
3   426          BD           BD          BD          BD          BD          BD          BD
4   447          BC           BC          BC          BC          BC          BC          BC
5    87          BF           BF          BF          BF          BF          BF          BF

我想保留所有具有相同值的列,例如'BB'。尽管我确定这很简单,但是我还没有遇到执行此操作的函数。感谢您的帮助!

3 个答案:

答案 0 :(得分:2)

尝试

df[, sapply(df, function(x) length(unique(x)) == 1]

或使用Filter

Filter(function(x) length(unique(x)) == 1, df)

答案 1 :(得分:2)

一种purrr方法:

library(purrr)
df %>% keep(~ length(unique(.x)) == 1)

N.B。 -您可以使用discarddf %>% discard(~ length(unique(.x)) == 1)来将其反转。

答案 2 :(得分:1)

在基数R中:

# Your data
df <- read.table(header = TRUE, text = "
Mouse JAX00000010 JAX00000010r UNCHS000003 JAX00240606 JAX00240613 JAX00240636 UNCHS000005
1   407          BF           BF          BF          BF          BB          BF          BF
2   410          BH           BH          BH          BH          BB          BH          BH
3   426          BD           BD          BD          BD          BB          BD          BD
4   447          BC           BC          BC          BC          BB          BC          BC
5    87          BF           BF          BF          BF          BB          BF          BF")

# Get cols
get.cols <- which(apply(df[,-1] == "BB", 2, all))
df[,c(1, get.cols + 1)]
#  Mouse JAX00240613
#1   407          BB
#2   410          BB
#3   426          BB
#4   447          BB
#5    87          BB

编辑,糟糕,我把这个问题误认为是特定的搜索字符串。如果不是这种情况,并且您正在寻找仅包含一个值的列,则可以进行以下操作:

get.cols <- which(apply(df, 2, function(x) length(unique(x)) == 1))
df[, c(1, get.cols)]
#  Mouse JAX00240613
#1   407          BB
#2   410          BB
#3   426          BB
#4   447          BB
#5    87          BB

假设您也要输出第一列。如果没有,那么您当然可以简化一下。