【问题标题】:Remove rows that contain more than one string in a cell in a data frame删除数据框中单元格中包含多个字符串的行
【发布时间】:2017-06-30 23:43:36
【问题描述】:

我有一个包含 8 列和许多行的数据框。我想删除第 6 列和第 7 列中包含多个字符串的行,并输出第 6 列和第 7 列中只有一个字符串的数据框

df:

ID  Content_ID  Chromosome  Start   Stop    Reference   Alternate Length
1299675221  backbone    12  99675221    99675221    GG  T   0
1298583685  backbone    12  98583685    98583685    C   T   0
129833474   backbone    12  9833474     9833474     C   T   0
1297722695  backbone    12  97722695    97722695    A   G   0
1297381269  backbone    12  97381269    97381269    T   C   0
1297081605  backbone    12  97081605    97081605    G   AA  0
1297058068  backbone    12  97058068    97058068    T   C   0
1295891848  backbone    12  95891848    95891848    CCTT ATA    0
1294164312  backbone    12  94164312    94164312    T   C   0
12940191    backbone    12  940191      940191      T   C   0

想要的输出:

ID  Content_ID  Chromosome  Start   Stop    Reference   Alternate   Length
1298583685  backbone    12  98583685    98583685    C   T   0
129833474   backbone    12  9833474     9833474     C   T   0
1297722695  backbone    12  97722695    97722695    A   G   0
1297381269  backbone    12  97381269    97381269    T   C   0
1297058068  backbone    12  97058068    97058068    T   C   0
1294164312  backbone    12  94164312    94164312    T   C   0
12940191    backbone    12  940191      940191      T   C   0

【问题讨论】:

    标签: r dataframe filter dplyr subset


    【解决方案1】:

    我们可以使用lapply遍历第6列和第7列,检查字符数是否为1,使用Reduce&通过比较@987654325的对应元素得到逻辑vector @,用它来子集'df'的行

    df[Reduce(`&`, lapply(df[6:7], function(x) nchar(x)==1)),]
    #        ID Content_ID Chromosome    Start     Stop Reference Alternate Length
    #2  1298583685   backbone         12 98583685 98583685         C         T      0
    #3   129833474   backbone         12  9833474  9833474         C         T      0
    #4  1297722695   backbone         12 97722695 97722695         A         G      0
    #5  1297381269   backbone         12 97381269 97381269         T         C      0
    #7  1297058068   backbone         12 97058068 97058068         T         C      0
    #9  1294164312   backbone         12 94164312 94164312         T         C      0
    #10   12940191   backbone         12   940191   940191         T         C      0
    

    或者另一个选项是rowSums

    df[!rowSums(nchar(as.matrix(df[6:7]))!=1),]
    

    【讨论】:

      【解决方案2】:

      同样,您可以将列粘贴在一起,然后保留字符数等于 3 的行,每列一个字符和一个空格。

      df[nchar(paste(df$Reference, df$Alternate)) == 3,]
                 ID Content_ID Chromosome    Start     Stop Reference Alternate Length
      2  1298583685   backbone         12 98583685 98583685         C         T      0
      3   129833474   backbone         12  9833474  9833474         C         T      0
      4  1297722695   backbone         12 97722695 97722695         A         G      0
      5  1297381269   backbone         12 97381269 97381269         T         C      0
      7  1297058068   backbone         12 97058068 97058068         T         C      0
      9  1294164312   backbone         12 94164312 94164312         T         C      0
      10   12940191   backbone         12   940191   940191         T         C      0
      

      【讨论】:

        【解决方案3】:

        使用data.table就这么简单

        library(data.table)
        
        setDT(df)
        df <- df[ nchar(Reference)==1 & nchar(Alternate)==1]
        

        【讨论】:

          猜你喜欢
          • 2019-12-02
          • 2021-10-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-08-07
          相关资源
          最近更新 更多