Sparklyr管道中提取helpful列数值计算help列失败求助
解决sparklyr中提取数字并计算help列的问题
看起来你遇到的核心问题是正则表达式匹配范围太窄,加上在sparklyr管道操作中错误引用数据集列,以及提取后的字符串未转为数值类型。咱们一步步来解决:
问题诊断
- 你的正则
"[0-9]"只能匹配单个数字,但如果helpful列内容是类似"(12,5)"或"(0,0)"这类包含多位数的格式,就会提取失败,导致col1、col2为空。 - 在sparklyr的
mutate里直接用csj$helpful不合适——Spark DataFrame是分布式懒加载的,管道操作中应该直接用列名,不需要加数据集前缀。 - 提取结果默认是字符类型,直接做除法会产生NaN,必须先转为数值型。
修正后的代码
假设你的helpful列格式是类似"(x,y)"(比如"(3,0)"、"(10,2)"),可以用下面的代码:
csj %>% mutate( # 提取第一个数字,匹配一个或多个数字并转为数值型 col1 = as.numeric(stringi::stri_extract_first_regex(helpful, pattern = "[0-9]+")), # 提取第二个数字,同样匹配一个或多个数字并转为数值型 col2 = as.numeric(stringi::stri_extract_last_regex(helpful, pattern = "[0-9]+")), # 处理col2为0的情况,替换为1 col3 = ifelse(col2 == 0, 1, col2), # 计算目标help列 help = col1 / col3 ) %>% # 可选:去掉中间临时列,保留需要的字段 select(-col1, -col2, -col3)
额外优化:更精准的正则匹配
如果helpful列格式固定为"(数字,数字)",可以用更精准的正则避免意外匹配其他数字:
csj %>% mutate( # 匹配括号内第一个数字组 col1 = as.numeric(stringi::stri_match_first_regex(helpful, pattern = "\\(([0-9]+),")[,2]), # 匹配括号内第二个数字组 col2 = as.numeric(stringi::stri_match_last_regex(helpful, pattern = ",([0-9]+)\\)")[,2]), col3 = ifelse(col2 == 0, 1, col2), help = col1 / col3 ) %>% select(-col1, -col2, -col3)
关键注意点
- 先确认
helpful列的格式是否符合预期,如果是其他分隔符(比如"x/y"),需要对应调整正则表达式。 - 在sparklyr中操作时,要遵循分布式处理逻辑,管道内直接用列名即可,不要引用整个数据集的列(比如
csj$helpful)。 - 提取后的字符必须转为数值型,否则除法运算会出错。
内容的提问来源于stack exchange,提问作者Alice Shin
相关产品推荐
相关产品推荐

