如何在R语言中对DataFrame分号分隔列计算首尾数值差并新增列
解决方法
Base R 实现
直接用基础R函数处理,无需额外安装包:
# 原始数据框 df <- data.frame(x=c("1;2;3","1;1;1;1"),y=c(5,5)) # 计算新列z:每行最后一个数字减第一个数字 df$z <- sapply(strsplit(as.character(df$x), ";"), function(vec) { as.numeric(vec[length(vec)]) - as.numeric(vec[1]) })
执行后df会自动新增列z,结果完全符合预期。
Tidyverse 实现
如果习惯用tidyverse工具链,可选择以下两种方式:
方法1:拆分列后提取首尾值
library(dplyr) library(tidyr) df <- data.frame(x=c("1;2;3","1;1;1;1"),y=c(5,5)) %>% # 按分号拆分x列,生成临时拆分列 separate_wider_delim(x, ";", names_sep = "_", too_few = "align_start") %>% # 提取第一个和最后一个拆分出的数字,计算差值 mutate( first_num = as.numeric(select(., starts_with("x_"))[[1]]), last_num = as.numeric(select(., starts_with("x_"))[[ncol(.) - 1]]), z = last_num - first_num ) %>% # 保留原始列和新计算列 select(x, y, z)
方法2:生成数字列表后处理
library(dplyr) library(stringr) library(purrr) df <- data.frame(x=c("1;2;3","1;1;1;1"),y=c(5,5)) %>% mutate( # 将每行字符串拆分为数字列表 num_list = str_split(x, ";"), # 提取列表中的第一个和最后一个元素并转数值 first_num = as.numeric(map_chr(num_list, ~ .x[1])), last_num = as.numeric(map_chr(num_list, ~ .x[length(.x)])), # 计算差值得到新列 z = last_num - first_num ) %>% # 移除中间临时列 select(-num_list, -first_num, -last_num)
两种tidyverse方法都能得到目标数据框。
内容的提问来源于stack exchange,提问作者MAJ
相关产品推荐
相关产品推荐

