如何为For循环迭代生成的子列表命名以转换为tibble并计算行均值?
解决列表命名与代码报错问题
给子列表命名的两种方法
你可以通过以下两种方式,给每个子列表命名为循环迭代对应的整数:
方法1:循环内直接指定名称
在给All_list赋值时,把迭代变量i转为字符类型,作为列表元素的名称:
for(i in 1:length(input_df$Name)) { # 注意:去掉paste0,Start/Stop是数值,直接传入seq.int即可 myoutput <- data.frame( Value = seq.int(input_df$Start[i], input_df$Stop[i]) ) # 用字符型的i作为列表元素名称 All_list[[as.character(i)]] <- myoutput$Value }
方法2:循环结束后统一命名
如果不想修改循环内部逻辑,可在循环完成后给列表批量设置名称:
# 循环保持原有写法(需先修正seq.int的参数问题) for(i in 1:length(input_df$Name)) { myoutput <- data.frame( Value = seq.int(input_df$Start[i], input_df$Stop[i]) ) All_list[[i]] <- myoutput$Value } # 统一设置列表元素名称为"1","2","3"... names(All_list) <- as.character(1:nrow(input_df))
修正其他代码错误
你的代码还有两个会导致后续运行失败的问题:
- seq.int传入了字符串:
paste0(input_df$Start[i])把数值转成了字符串,会让seq.int生成字符序列,后续计算均值时会报错,直接使用原始数值即可。 - c_across引用了未定义的变量:原代码中的
myvector未定义,替换为c_across(everything())即可选中所有列计算均值。
完整可运行代码
library(tidyverse) input_df <- data.frame( Name = c("A", "B", "C"), Start = c(100,250,350), Stop = c(150,300,400) ) All_list <- list() for(i in 1:length(input_df$Name)) { myoutput <- data.frame( Value = seq.int(input_df$Start[i], input_df$Stop[i]) ) # 循环内直接命名子列表 All_list[[as.character(i)]] <- myoutput$Value } All_df <- All_list %>% as_tibble() %>% rowwise() %>% mutate(Average = mean(c_across(everything()))) %>% ungroup() # 查看最终结果 All_df
内容的提问来源于stack exchange,提问作者JVGen
相关产品推荐
相关产品推荐

