【问题标题】:Filter a Data.frame based on Rownames根据 Rownames 过滤 Data.frame
【发布时间】:2020-02-25 14:15:34
【问题描述】:
c <- data.frame("c1"=c(78,89,0),"c2"=c(89,89,34),"c3"=c(56,0,4))
row.names(c) <- c("zebra","fish","zucchini")


c <- rm(grep("z",rownames(c))) ??

希望简短的问题,简短的回答:上面的代码有什么问题?它说我“必须包含名称或字符串”。如何删除行名中包含 z 的所有行。在这个 reprex 中只剩下一条鱼。

非常感谢

【问题讨论】:

标签: r rowname


【解决方案1】:

1) grepl有几个问题:

  • 问题中的测试数据有错误,所以我们使用最后注释中的那个
  • 虽然没有完全错误,但c 不是一个好名字,因为在 R 中无处不在使用 c 函数,所以我们改用 cc
  • 我们使用grepl,末尾带有l,而不是grep,以获得逻辑向量结果,然后使用!否定它。
  • rm 用于从工作空间中删除对象,而不是从数据框中删除行,因此我们使用下标。

没有使用任何包。

cc[!grepl("z", rownames(cc)), ]
##      c1 c2 c3
## fish 89 89  0

2) grep 作为替代方案,也可以将grep 与invert=TRUE 参数一起使用:

cc[grep("z", rownames(cc), invert = TRUE), ]
##      c1 c2 c3
## fish 89 89  0

3) substr 在示例中,z 字符始终作为第一个字符出现,因此如果是一般情况,我们可以交替使用:

cc[substr(rownames(cc), 1, 1) != "z", ]
##      c1 c2 c3
## fish 89 89  0

3a) startsWith 如果z 必须是第一个字符,另一种方法是:

cc[!startsWith(rownames(cc), "z"), ]
##      c1 c2 c3
## fish 89 89  0

注意

cc <- data.frame(c1 = c(78, 89, 0), c2 = c(89, 89, 34), c3 = c(56, 0, 4))
row.names(cc) <- c("zebra", "fish", "zucchini")

【讨论】:

    【解决方案2】:

    Rm 删除对象。您正在尝试按行过滤。

    c <- data.frame("c1"=c(78,89,0),"c2"=c(89,89,34),"c3"=c(56,0,4))
    row.names(c) <- c("zebra","fish","zucchini")
    
    print( c )
    c[ !grepl("z",rownames(c)) , ] 
    

    【讨论】:

      【解决方案3】:

      您的示例使用了已弃用的属性。我已经对其进行了一些编辑。

      /Edit:现在我了解到您希望删除这些行,请参见以下示例:

      c <- tibble("c1"=c(78,89,0),"c2"=c(89,89,34),"c3"=c(56,0,4),
                  "rownames"=c("zebra","fish","zucchini")) %>% 
        column_to_rownames("rownames")
      
      c[!grepl("i", rownames(c)),] 
      
            c1 c2 c3
      zebra 78 89 56
      
      

      此外,如前所述,c 不应该是对象名称,因为它也是 R 中的中心函数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-01-27
        • 2015-03-26
        • 2017-05-23
        • 1970-01-01
        • 2021-07-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多