如何用R tidyverse拆分字符串并计算行均值?能否用purrr::map替代lapply?
处理Tibble中每行字符串列表的均值计算(含purrr::map替代lapply方案)
问题说明
你需要将Measurements列的逗号分隔字符串拆分为数值,再计算每行的均值。原lapply写法的问题在于它是对整个数据框的列进行操作,而非针对Measurements列的每个元素逐行处理,因此无法得到每行独立的数值列表。
解决方案(用purrr::map实现)
利用dplyr的mutate结合purrr::map系列函数,可以高效完成拆分、转数值、计算均值的流程:
方法一:分步处理(保留中间数值列表列)
library(tidyverse) library(magrittr) # 你的原始数据 df <- tibble( Time = c('June 7', 'June 8', 'June 9', 'June 10', 'June 11', 'June 12', 'June 13', 'June 14', 'June 15', 'June 16', 'June 17', 'June 18', 'June 19', 'June 20', 'June 21', 'June 22', 'June 23', 'June 24', 'June 25', 'June 26', 'June 27', 'June 28'), Measurements = c('105, 54, 79, 49, 31, 84, 55', '50, 105, 85, 72, 27, 43', '58, 26, 38', '67, 52, 92, 46', '73, 59, 62', '57, 24', '78, 96, 107', '76, 49, 40, 34, 44, 55', '18, 60, 39', '39, 55, 35', '86, 27, 91, 49, 23, 65, 32, 74', '32, 47, 57', '70, 56', '146, 39', '94, 39, 21, 72, 55', '48, 70, 10, 160', '126, 87, 107, 45, 55, 39', '33, 62, 38', '43, 63, 68, 21, 126, 87, 107', '56, 86, 64', '66, 55', '34, 44, 55, 72, 51, 42') ) # 处理流程 df_with_mean <- df %>% mutate( # 将每行的Measurements拆分为数值向量,存为列表列 num_measurements = map(Measurements, ~ str_split(.x, ', ') %>% unlist() %>% as.numeric()), # 对每个数值向量计算均值,返回数值列 mean_measurement = map_dbl(num_measurements, mean) ) # 查看结果(仅展示时间和均值列) df_with_mean %>% select(Time, mean_measurement)
方法二:合并为一步(不保留中间列)
如果不需要保留拆分后的数值列表,可以直接在map_dbl中完成所有操作:
df_with_mean <- df %>% mutate(mean_measurement = map_dbl(Measurements, ~ { str_split(.x, ', ') %>% unlist() %>% as.numeric() %>% mean() }))
代码解释
map(Measurements, ...):针对Measurements列的每个元素(即每行的字符串)执行后续操作,返回一个列表列,每个元素是该行对应的数值向量。map_dbl(..., mean):针对列表列的每个数值向量计算均值,返回一个数值列(_dbl后缀表示输出为双精度数值)。str_split(.x, ', '):将字符串按,拆分,返回字符向量;unlist()用于去除str_split返回的列表结构,转为普通向量;as.numeric()转为数值型。
内容的提问来源于stack exchange,提问作者psych0groov3
相关产品推荐
相关产品推荐

