0

我在 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 中的整个字符串放在“名称”列中。不知何故,我只想使用句号之前的文本(没有句号或数字)。有谁知道我该怎么做?

谢谢!

4

2 回答 2

2

这里有 2 种替代方法。qdap 中的 1 个基础和 1 个:

## 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), ".")
于 2013-05-23T00:40:40.363 回答
2

具体来说,保留第一个字符之前的所有文本.

df$Name <- sub('[.].*','', rownames(df))

在正则表达式中,.表示匹配任何字符。因此,要匹配文字点,必须对字符进行转义。但是,在字符类(以[and为界])中,.确实表示文字点。也就是说,[.]仅匹配文字点。

接下来是.*匹配任意数量的任意字符。

因此,表达式匹配从第一个文字.到字符串结尾的所有内容,并将其替换为空字符串。

于 2013-05-23T00:22:24.847 回答