我在R中有一个看起来像这样的对象
Value
AAAAA.1569.12.32 5
C.4586.25.65 2
AAAAA.4568.32.54 2
BBB.5462.23.32 3
BBB.5425.36.25 5
C.5658.25.24 4
我希望它看起来像这样
Value Name
AAAAA.1569.12.32 5 AAAAA
C.4586.25.65 2 C
AAAAA.4568.32.54 2 AAAAA
BBB.5462.23.32 3 BBB
BBB.5425.36.25 5 BBB
C.5658.25.24 4 C
我用过
df$Name = rownames(df)
但是这会将row.names中的整个字符串放在“Name”列中。不知何故,我只想使用期间之前的文本(没有句号或数字)。有谁知道我怎么做这个?
谢谢!
答案 0 :(得分:2)
具体而言,请保留第一个.
字符之前的所有文字:
df$Name <- sub('[.].*','', rownames(df))
在正则表达式中,.
表示匹配任何字符。因此,要匹配文字点,必须转义该字符。但是,在字符类(由[
和]
限定)中,.
确实代表一个字面点。也就是说,[.]
仅匹配文字点。
之后是.*
,它匹配任意数量的任何字符。
因此,表达式匹配从第一个文字.
到字符串结尾的所有内容,并将其替换为空字符串。
答案 1 :(得分:2)
以下是两种替代方式。 1个基数和1个qdap:
## df <- structure(list(Value = c(5L, 2L, 2L, 3L, 5L, 4L)), .Names = "Value", class = "data.frame", row.names = c("AAAAA.1569.12.32",
## "C.4586.25.65", "AAAAA.4568.32.54", "BBB.5462.23.32", "BBB.5425.36.25",
## "C.5658.25.24"))
df$Name <- sapply(strsplit(rownames(df), "\\."), "[", 1)
library(qdap)
df$Name <- beg2char(rownames(df), ".")