如何仅填充DataFrame中size为0的行?取值自name列最后段
解决DataFrame中仅修改size为0行的问题
我明白你的困扰——想只更新size列值为0的行,把它们替换成name列的最后一段,但之前的代码不小心修改了所有行对吧?别担心,核心就是精准筛选目标行再赋值,下面给你两种可行的方案:
基础R方案
先确认你的示例数据:
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) )
步骤很清晰:先提取name列的最后一段,然后只给size == 0的行赋值:
# 拆分name列,提取每个元素的最后一段 last_part <- sapply(strsplit(as.character(vertices$name), "\\."), function(x) x[length(x)]) # 转为数值型(适配你示例里的数字结尾场景,若最后一段是文本可跳过此步) last_part <- as.numeric(last_part) # 关键操作:仅修改size为0的行,不影响其他数据 vertices$size[vertices$size == 0] <- last_part[vertices$size == 0]
tidyverse(dplyr)方案
如果你习惯用tidyverse语法,代码会更简洁直观:
library(dplyr) library(stringr) vertices <- vertices %>% mutate( size = case_when( size == 0 ~ as.numeric(str_split(name, "\\.") %>% map_chr(last)), TRUE ~ size # 其他行保持原size值不变 ) )
验证结果
运行后你会得到符合预期的DataFrame:
print(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
核心要点就是利用逻辑索引或者case_when来限定修改范围,这样就不会误改其他行啦!
内容的提问来源于stack exchange,提问作者Ibo
相关产品推荐
相关产品推荐

