如何用dplyr提取数据框列表列的首个元素替换原列值?
问题原因
你写的YEARS[[1]][1]是直接取整个YEARS列表列的第一个元素的第一个值(也就是"2020"),dplyr会把这个单一值自动重复填充到每一行,所以所有行的YEARS都变成了2020,没有实现逐行提取每个列表的首个元素。
解决方法
以下是几种基于dplyr生态的实现方式:
方案1:直接拆分时就取第一个元素
可以用str_split_fixed直接返回矩阵,然后提取第一列,不用先生成列表列:
library(dplyr) library(stringr) YEARS <- c("2020/2021", "2021/2022", "2022/2023") VALUE <- c(10,5,3) x <- data.frame(YEARS, VALUE) %>% mutate(YEARS = str_split_fixed(YEARS, "/", n=2)[,1])
如果已经生成了列表列,用purrr::map_chr逐行提取第一个元素:
x %>% mutate(YEARS = purrr::map_chr(YEARS, ~ .x[1]))
方案2:正则提取开头的年份
不用拆分,直接用str_extract匹配字符串开头的四位数字:
x %>% mutate(YEARS = str_extract(YEARS, "^\\d{4}"))
方案3:拆分列后保留目标列
如果后续可能用到第二个年份,用tidyr::separate拆分到两列,再选择需要的列:
library(dplyr) library(tidyr) x %>% separate(YEARS, into = c("YEAR_START", "YEAR_END"), sep = "/") %>% rename(YEARS = YEAR_START) %>% # 重命名回原列名 select(YEARS, VALUE)
内容的提问来源于stack exchange,提问作者axel
相关产品推荐
相关产品推荐

