我正在尝试填充其值为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.我该如何解决这个问题?
答案 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)
使用stringr
和dplyr
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