【问题标题】:R - how to print only the field containing a string matchR - 如何仅打印包含字符串匹配的字段
【发布时间】:2016-07-08 13:23:04
【问题描述】:

使用以下命令:kable(head(table), format = "markdown")

我生成了以下table

|V1             |V2                    |V3                   |V4                  |V5                   |V6                    |V7                   |V8                    |V9            |V10              |
|:--------------|:---------------------|:--------------------|:-------------------|:--------------------|:---------------------|:--------------------|:---------------------|:-------------|:----------------|
|LdBPK_271870.1 |plasma membrane: 0.52 |Golgi apparatus: 0.2 |ER: 0.09            |extracellular: 0.08  |mitochondrial: 0.07   |cytoplasmic: 0.02    |lysosomal: 0.01       |nuclear: 0.01 |peroxisomal: 0.0 |
|LdBPK_220004.1 |nuclear: 0.56         |cytoplasmic: 0.42    |mitochondrial: 0.01 |peroxisomal: 0.0     |Golgi apparatus: 0.0  |plasma membrane: 0.0 |extracellular: 0.0    |ER: 0.0       |lysosomal: 0.0   |
|LdBPK_020440.1 |cytoplasmic: 0.54     |nuclear: 0.45        |mitochondrial: 0.0  |Golgi apparatus: 0.0 |peroxisomal: 0.0      |plasma membrane: 0.0 |extracellular: 0.0    |ER: 0.0       |lysosomal: 0.0   |
|LdBPK_313080.1 |nuclear: 0.6          |cytoplasmic: 0.29    |mitochondrial: 0.06 |peroxisomal: 0.02    |Golgi apparatus: 0.01 |extracellular: 0.01  |plasma membrane: 0.01 |ER: 0.0       |lysosomal: 0.0   |
|LdBPK_201720.1 |cytoplasmic: 0.89     |nuclear: 0.06        |mitochondrial: 0.02 |peroxisomal: 0.01    |Golgi apparatus: 0.01 |extracellular: 0.0   |plasma membrane: 0.0  |ER: 0.0       |lysosomal: 0.0   |
|LdBPK_070130.1 |cytoplasmic: 0.61     |nuclear: 0.32        |peroxisomal: 0.05   |mitochondrial: 0.02  |Golgi apparatus: 0.0  |plasma membrane: 0.0 |extracellular: 0.0    |ER: 0.0       |lysosomal: 0.0   |

在我的table 中,我想遍历每一行并且:

  1. 打印列 V1
  2. 循环遍历每一行并仅打印与我之后的字符串匹配的字段

例如,假设我在字符串“nuclear”之后,代码将执行以下操作。

  1. 在第一行,打印 V1 列下的字段 (LdBPK_271870.1),然后
  2. 从列 V2 到 V10 扫描并仅打印与字符串“nuclear”匹配的整个字段(即包括字符串“nuclear”之后的值)。
  3. 对我表的所有行重复此操作。

在这种情况下,考虑到我的table,代码将在第一行打印 V1 和 V9 下的字段。在第二行,代码会打印出 V1 和 V2 下的字段。在第三个它将打印我,V1 和 V3 下的字段。直到它到达我桌子的尽头。然后输出将是一个包含两列的表:第一列与 V1 相同,第二列仅包含字符串“nuclear”和每行后面的值。

我无法使用方括号对我的数据进行子集化,因为我要查找的字符串可以位于 V2 到 V10 的任何列下。

【问题讨论】:

  • 为什么字符串在任何列中意味着您不能子集方括号?想象一个嵌套的 for 循环,它检查每个元素以查看 [i,j] 元素是否包含字符串“nuclear”。如果是,做X。如果不是,通过。
  • 我的意思是不使用任何循环...
  • 在你的问题中你说你想循环。
  • 我绝对可以使用循环。我想说的是,带有方括号的子设置(没有任何循环的帮助)不会完成这项工作。
  • 我下面的答案是否打印出您感兴趣的内容?

标签: r loops subset


【解决方案1】:

这可能不是最快的方法(因为它每次迭代都会重新创建一个向量),但您可以尝试这样的方法。这将为每一行打印出第一列 (V1) 以及包含所需字符串的列。如果一列没有您想要的字符串,它不会打印出 V1 值(但您没有指出这是一个问题)。如果您事先知道所需的字符串只会出现在一列中,您可以通过将“相关”向量初始化为长度 1 然后输入列值来加快此循环。

for(row in 1:nrow(table)) {
    relevant = c()
    for(col in 1:ncol(table)) {
        if(grepl("your_string", table[row, col])) {
            relevant <- c(relevant, col)
        }

    }
    if(length(relevant) > 0) {
        print(paste(table[row, 1], table[row, relevant]))
    }
}

【讨论】:

  • 完美,现在工作完美,完全符合我的要求。非常感谢。
  • @BCArg 非常欢迎您!请接受这个答案,以防将来有人有同样的问题并看到这篇文章
  • 但更好的是输出为两列的表格,但这种方式绝对没问题。我可能可以使用 cbind 将此向量绑定到原始表的第一列
  • @BCArg 如果要添加到数据帧而不是打印行,可以在循环之前创建一个空数据帧,然后使用“rbind”在每次迭代时向数据帧添加一行(而不是打印)
猜你喜欢
  • 1970-01-01
  • 2019-04-24
  • 1970-01-01
  • 2019-07-30
  • 2020-11-12
  • 2022-11-19
  • 1970-01-01
  • 2019-06-05
  • 2019-11-11
相关资源
最近更新 更多