R语言如何为列表内对应数据框yn为No的整数前添加负号并保留结构
实现方案
方案1:tidyverse 版本(易读性高)
library(tidyverse) # 批量处理n字段内容 new_n <- list$name %>% map_chr(function(cur_name) { # 拆分当前name对应的原n字符串为整数向量 origin_nums <- str_split(list$n[list$name == cur_name], ",\\s*")[[1]] %>% as.integer() # 匹配df的yn标记,给No对应的数值添加负号 modified_nums <- map_chr(origin_nums, function(num) { yn_tag <- df$yn[df$name == cur_name & df$n == num] ifelse(yn_tag == "No", paste0("-", num), as.character(num)) }) # 重新拼接为逗号分隔的字符串 paste(modified_nums, collapse = ", ") }) # 替换原列表的n字段,其余结构保持不变 list$n <- new_n
运行后输出验证:
> list$n [1] "1, 2, -3, -4, 5" "-6, 7, 8" "9, 10" "-11, 12, 13, -14" "15, 16, 17"
方案2:base R 版本(无额外依赖)
new_n <- character(length(list$name)) for (i in seq_along(list$name)) { cur_name <- list$name[i] # 拆分原n字符串 origin_nums <- as.integer(strsplit(list$n[i], ",\\s*")[[1]]) modified_nums <- character(length(origin_nums)) # 逐个数值匹配yn标记 for (j in seq_along(origin_nums)) { num <- origin_nums[j] yn_tag <- df$yn[df$name == cur_name & df$n == num] modified_nums[j] <- ifelse(yn_tag == "No", paste0("-", num), as.character(num)) } new_n[i] <- paste(modified_nums, collapse = ", ") } # 替换n字段 list$n <- new_n
说明
- 两种实现均符合题目前置条件,不会修改原列表的
name、type字段,仅更新n字段内容 - 自动适配
n字段中不同长度的数值串,无需手动调整参数
内容的提问来源于stack exchange,提问作者HSJ
相关产品推荐
相关产品推荐

