R - 如何仅打印包含字符串匹配的字段

时间:2016-07-08 13:23:04

标签: r loops subset

使用以下命令: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. 遍历每一行并仅打印与我之后的字符串匹配的字段
  3. 例如,假设我在字符串“nuclear”之后代码将执行以下操作。

    1. 在第一行,打印V1列(LdBPK_271870.1)下的字段,然后
    2. 从列V2到V10扫描并且仅打印与字符串“核”匹配的整个字段(即,包括字符串“核”之后的值)。
    3. 对我桌子的所有行重复此操作。
    4. 在这种情况下,考虑我的table代码,在第一行,打印V1和V9下的字段。在第二行,代码将打印出V1和V2下的字段。在第三个它打印我,V1和V3下的字段。直到它到达我的桌子的尽头。输出将是一个包含两列的表:第一列与V1相同,第二列仅包含字符串“nuclear”以及每行的值。

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

1 个答案:

答案 0 :(得分:0)

这可能不是最快的方法(因为它每次迭代都会重新创建一个向量),但你可以试试这样的东西。这将打印第一列(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]))
    }
}