基于行名过滤Data.frame

wxclj1h5  于 2023-04-03  发布在  其他
关注(0)|答案(3)|浏览(116)
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中只剩下鱼。
非常感谢

k4ymrczo

k4ymrczo1#

1)grepl有几个问题:

  • 问题中的测试数据有错误,所以我们使用最后注解中的数据
  • 虽然严格来说不是错误的,但c不是一个好名字,因为在R中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

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

hgc7kmma2#

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

kzipqqlq3#

您的示例使用了不推荐使用的属性。我对它进行了一些编辑。
/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中的一个中心函数。

相关问题