R中是否有一个函数允许选择行名称以小写字母结尾的行,并删除该字母?
我有以下R中是否有一个函数允许选择行名称以小写字母结尾的行,并删除该字母?,r,R,我有以下数据帧: data <- as.data.frame(seq(1:5)) rownames(data) <- c("abc-2A","abc-2b", "def-3", "ACD4.54Y", "ghj-5c") data seq(1:5) abc-2A 1 abc-2b 2 def-3 3 ACD4.54Y 4 ghj-5c 5 从原始data.frame中
数据帧
:
data <- as.data.frame(seq(1:5))
rownames(data) <- c("abc-2A","abc-2b", "def-3", "ACD4.54Y", "ghj-5c")
data
seq(1:5)
abc-2A 1
abc-2b 2
def-3 3
ACD4.54Y 4
ghj-5c 5
data.frame
中的行名称中删除此小写字母。最后的data.frame
将是:
seq(1:5)
abc-2b 2
ghj-5c 5
seq(1:5)
abc-2A 1
abc-2 2
def-3 3
ACD4.54Y 4
ghj-5 5
非常感谢 您可以使用
dplyr::filter
函数根据某些条件筛选行。
字符串末尾的小写字母可以用如下正则表达式标识[a-z]$
。将所有这些结合起来会产生以下结果
library(dplyr)
mydata <- data.frame(id = c("select thiss", "DONT SELECT"), x = 1:2)
mydata %>%
filter(grepl("[a-z]$", id)) %>%
mutate(id = sub("[a-z]$", "", id))
id x
1 select this 1
库(dplyr)
mydata%
筛选器(grepl(“[a-z]$”,id))%>%
变异(id=sub(“[a-z]$”,“”,id))
id x
1选择此1
数据帧上的行名基本上是一个与数据帧列长度相同的向量,另外要求它(通常)是唯一的,并且必须是字符向量
最简单的方法是将其作为附加列添加:
data$whatever <- rownames(data)
其中,x
是感兴趣的向量。要删除(即用替换有问题的字符)(
),请使用sub
:
sub("[a-z]$", "", x)
把这些放在一起,你会得到什么:
rownames(data) <- sub("[a-z]$", "", rownames(data))
rownames(data)选择以小写字母结尾的行(来自@Rui Barradas)
使用基本Rsub
rownames(data) <- sub("(.*)[a-z]$", "\\1", rownames(data))
data
# seq(1:5)
#abc-2A 1
#abc-2 2
#def-3 3
#ACD4.54Y 4
#ghj-5 5
rownames(data)并选择它们:data[grep(“[a-z]$”,rownames(data)),drop=FALSE]
@ruibradas OP是否要选择它们?我以为它们只是作为达到最终输出的一种方式展示出来的。谢谢你的回答,它很有效@RuiBarradas感谢您提供的额外代码!有一个错误:在行名指令中,“ghj-5c”
没有“c”
。请编辑您的代码。@RuiBarradas谢谢您发现它。我已经编辑了代码。谢谢你的回答。这实际上是我最喜欢的,因为我一直在尝试在我的编码中实现“Tidyverse哲学”。但这并没有完成OP要求的子集设置/过滤。OP实际上不是要求过滤,OP只是使用子集设置作为中间步骤,以确定要执行操作的元素。事实证明,我们不需要这样做。问题当前要求“1.生成此数据帧的子集…其中行名称以小写字母结尾”查看问题的上下文。第(1)项仅要求将其作为获取要在其上执行操作的元件的手段。查看(2)中的“final data.frame”,它显然没有被使用。此外,我的答案中的grepl
命令返回一个可用于过滤的索引向量。
data[grep("[a-z]$", rownames(data)),, drop = FALSE]
# seq(1:5)
#abc-2b 2
#ghj-5c 5
rownames(data) <- sub("(.*)[a-z]$", "\\1", rownames(data))
data
# seq(1:5)
#abc-2A 1
#abc-2 2
#def-3 3
#ACD4.54Y 4
#ghj-5 5