R语言seq函数处理多行数据报错及group_by生成序列异常咨询
错误原因
seq()函数本身仅支持接收长度为1的from/to/length.out参数,你直接传入整列向量(多值)时,函数无法同时处理多组参数,因此抛出长度不匹配的报错。- 你写的dplyr链式调用有两个问题:一是管道符会将前序的数据集作为第一个参数传入
seq(),导致from参数接收的是整个数据集而非计算值;二是分组后直接调用df$列名会取全局数据列,不会限制在组内取值,也会导致参数错误。
解决方法
你需要按行遍历数据集,每行取对应的参数生成序列,由于不同行的periods值不同,生成的序列长度不一致,我们可以将结果存在list类型的列中,方便后续调用或分组处理。
方案1:使用dplyr行向处理(最易理解)
library(dplyr) # 按行计算序列,存入list列 df_with_seq <- df %>% rowwise() %>% # 声明按行处理,每次仅读取一行的参数 mutate(seqi = list(seq(from = MtM/periods, to = MtM, length.out = periods))) %>% ungroup() # 处理完成后取消行分组 # 提取某一行的序列,比如第3行: df_with_seq$seqi[[3]]
如果需要先按Acct、Date分组后再计算,且同一组内的参数完全一致,可以修改为:
df_with_seq <- df %>% group_by(Acct, Date) %>% mutate(seqi = list(seq(from = first(MtM)/first(periods), to = first(MtM), length.out = first(periods)))) %>% ungroup()
方案2:使用purrr并行遍历参数
如果你更习惯用purrr处理多参数迭代,也可以用pmap实现同样效果:
library(purrr) df$seqi <- pmap( .l = list(m = df$MtM, p = df$periods), .f = function(m, p) seq(from = m/p, to = m, length.out = p) )
自定义函数适配多值输入的方法
如果你需要保留原来的dur函数,同时支持整列输入,可以将函数包装为向量化版本:
# 包装原函数为向量化版本 dur_vec <- Vectorize(dur, vectorize.args = c("Rate", "periods", "YtM2", "Price", "MtM", "Amount")) # 调用时直接传整列参数,返回的结果是list类型的序列集合 seqi_list <- dur_vec(df$Rate, df$periods, df$YtM2, df$Price, df$MtM, df$Amount)
内容的提问来源于stack exchange,提问作者a_js12
相关产品推荐
相关产品推荐

