根据行名过滤数据框架

问题描述 投票:0回答:3
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 rm rowname
3个回答
1
投票

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)) , ] 

1
投票

1] grepl有几个问题:

  • 问题中的测试数据有误,因此我们在末尾使用注释中的一个
  • 尽管不是严格错误,但由于R中普遍使用c函数,因此c并不是一个好名字,因此我们改用cc
  • 我们使用grepl并以l结尾,而不是grep,以获得逻辑向量结果,然后使用!否定它。
  • rm用于从工作空间中删除对象,而不是从数据框中删除行,因此我们改用下标。

未使用任何软件包。

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

[2)grep或者,也可以将grepinvert=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

注意

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")

-1
投票

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

// 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中的中心函数。

© www.soinside.com 2019 - 2024. All rights reserved.