如何根据row.names中的选定字符创建变量?

时间:2013-05-23 00:19:02

标签: r

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

谢谢!

2 个答案:

答案 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), ".")