【问题标题】:How can I filter out the value of similar (not same) row names in R如何过滤掉 R 中相似(不同)行名的值
【发布时间】:2014-05-13 18:52:29
【问题描述】:

我对 R 环境有些陌生。 我有一组字符“测试”。如果我想从样本数据(数字)中过滤掉该列的所有对应值,我可以通过匹配列名来实现。
例如

> test <-c("aa", "bb", "zz")

> head(sample.data)

aa aa-001 aa-099 cc zz

1   5      6      7  2

> temp<-test%in% names(sample.data)

这给了我一个逻辑向量,我可以用它来获取所需的数据

>temp

TRUE FALSE FLASE FLASE TRUE

> req.vec <- sample.data[temp]


> req.vec


aa zz


1  2

但是,是否有可能除了 aa 的值,我也可以过滤掉 aa-001 和 aa-099 的对应值?我无法匹配“aa”的所有变体,因为数据有 100 种 aa、bb zz 等的变体。

【问题讨论】:

  • 您希望如何更改样本数据的结果?您是说要保留以“aa”开头的每一列吗?
  • 嗨,是的,我想生成一组数据,其中包含具有相同初始名称的所有列的值。实际上,对于不同的列名,只有最后四个字符会发生变化。例如。如果列名是 aa-001 aa-005 bbb-001 bbb-090 acdb-001 acdb-007 等,我对包含“aa”和“acdb”等的值感兴趣。

标签: r function filter subset logical-operators


【解决方案1】:

如果他们的列名总是给定的格式,你可以这样做

test <-c("aa", "bb", "zz")
cn <- c("aa", "aa-001", "aa-099", "cc", "zz")
sample.data <- c(1,5,6,7,2)
names(sample.data) <- cn
sample.data[substr(cn, 1, 2) %in% test]
##    aa aa-001 aa-099     zz 
##     1      5      6      2

或者,您可以在 test 上迭代 grep

【讨论】:

  • 谢谢!我需要稍微修改一下。根据我的问题,只有最后 4 个字符发生了变化。因此,我没有使用 sample.data[substr(cn, 1, 2) %in% test],而是使用了 sample.data[substr(cn, 1, nchar(cn)-4)) %in% test]
【解决方案2】:

此示例使用grep 匹配以test 向量中的字符开头的任何列名。

test <- c("aa", "bb", "zz")
sample.data <- data.frame(aa=1, "aa-001"=5, "aa-099"=6,cc=7,zz=2)
cols <- apply(sapply(test, function(x) grepl(paste0("^",x),names(sample.data))),1,any)
sample.data[, cols]

既然你提到只有最后 4 个字符在改变,那么删除最后 4 个字符是有意义的

sample.data <- data.frame("aa-001"=1, "aa-005"=5, "bbb-001"=6,
    "bbb-090"=7,"acdb-001"=2, "acdb-007"=1)
test <- c("aa","acdb")
nn <- names(sample.data)
cols <- substr(nn,1,nchar(nn)-4) %in% test
sample.data[,cols]

或者如果你想删除任何以“-”和一些数字结尾的东西,你可以使用gsub

sample.data <- data.frame("aa-001"=1, "aa-005"=5, "bbb-001"=6,
    "bbb-090"=7,"acdb-001"=2, "acdb-007"=1, check.names = FALSE)
test <- c("aa","acdb")
cols <- substr(nn,1,nchar(nn)-4) %in% test
sample.data[,cols]

【讨论】:

  • 这就是我所做的。发布我的语法后刚刚看到您的回复。还是非常感谢您的回复:)
猜你喜欢
  • 2021-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多