繁体   English   中英

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

[英]Is there an R function to filter a dataframe in which columns with all matching values are kept?

我有一个大数据框,其中有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'。 尽管我确定这很简单,但是我还没有遇到执行此操作的函数。 谢谢你的帮助!

尝试

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

或使用Filter

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

purrr方法:

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

注意-您可以使用以下命令discard反转: df %>% discard(~ length(unique(.x)) == 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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM