使用另一列填充数据框中的某些行

时间:2018-05-08 01:42:51

标签: r regex dataframe

我正在尝试填充其值为0的列size。新值应该是列name的最后一段。我尝试了很多方法,但不知何故,当我尝试仅填充0行时,它不会返回正确的值:

示例数据:

vertices=data.frame(name=c("a","b","c","a.b","a.c","a.a.9","a.b.8"),size= c(1,5,6,2,6,0,0))

ID name size
1     a    1
2     b    5
3     c    6
4   a.b    2
5   a.c    6
6 a.a.9    0
7 a.b.8    0

此行符合预期,但我不想触摸不是size = 0的行:

vertices$size <- sub(".*\\.", "", vertices$name)

ID name size
1     a    a
2     b    b
3     c    c
4   a.b    b
5   a.c    c
6 a.a.9    9
7 a.b.8    8

将条件添加到代码时,它会返回错误的结果:

vertices$size[vertices$size==0] <- sub(".*\\.", "", vertices$name)

ID name size
1     a    1
2     b    5
3     c    6
4   a.b    2
5   a.c    6
6 a.a.9    a
7 a.b.8    b

最后两行应该是9和8.我该如何解决这个问题?

4 个答案:

答案 0 :(得分:2)

我们需要对name

进行子集化
vertices$size[vertices$size==0]<- sub(".*\\.", "", vertices$name[vertices$size==0])

vertices
#   name size
#1     a    1
#2     b    5
#3     c    6
#4   a.b    2
#5   a.c    6
#6 a.a.9    9
#7 a.b.8    8

或者您也可以使用效果相同的ifelse

vertices$size <- ifelse(vertices$size == 0, sub(".*\\.", "", vertices$name), 
                                            vertices$name)

正如评论size中提到的@Frank因为正则表达式方法而将其类从数字更改为字符。

sub(".*\\.", "", vertices$name[vertices$size==0])
#[1] "9" "8"

如果我们需要维护size列的类,我们可以使用as.numeric

as.numeric(sub(".*\\.", "", vertices$name[vertices$size==0]))
#[1] 9 8

然而,这再次假设最后一个字符size = 0为数字,如果是一个字符,则返回NA

答案 1 :(得分:1)

看起来你正在尝试保存错误大小的矢量。在最后一行你可能只想要

dispatch(helpers.updateListening(true))

你错过了RHS的条件。

你在最后两个位置得到“a”和“b”,因为它只是取向量的前两个元素(在你的情况下是所有名字的sub)。

答案 2 :(得分:1)

使用stringrdplyr

vertices %>% mutate(size = ifelse(size > 0, size, str_extract(name, "[0-9]+")))

答案 3 :(得分:1)

我们也可以使用regmatches/regexpr

vertices$size[!vertices$size] <- 
    as.numeric(regmatches(vertices$name, regexpr("\\d+$", vertices$name)))

vertices
#   name size
#1     a    1
#2     b    5
#3     c    6
#4   a.b    2
#5   a.c    6
#6 a.a.9    9
#7 a.b.8    8