我有一个for循环,它提取等长的数字范围,并将每个范围作为列表中的一个新列表追加.在for循环完成后,我希望将列表列表转换为数据框并计算行平均值.我目前不能将列表列表转换为Tibble,因为单独的列表没有命名.

如何将每个新列表命名为与循环迭代关联的整数?(例如,1、2、3……)

下面是简化的示例.我的Actual for循环做了一些更复杂的事情,但它捕捉到了我遇到的问题.

谢谢!

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(paste0(input_df$Start[i]), paste0(input_df$Stop[i]))
  )

#How do I specify that the name of added list is the value of the iteration [i]?
  All_list[[i]] <- myoutput$Value
}

All_df <- All_list %>%
  as_tibble() %>%
  rowwise() %>%
  dplyr::mutate(Average = mean(c_across(1:length(myvector)))) %>%
  ungroup()

Error in `as_tibble()`:
! Columns 1, 2, and 3 must be named.
Use `.name_repair` to specify repair.

推荐答案

在加载tidyverse时,可以使用purrr:pmap()同时映射到每一行来重写循环.我们可以将列rename()fromto,从而将它们提供给seq.int()×pmap():

out_df  <- input_df |>
    rename(from = Start, to = Stop) |>
    pmap(seq.int) |>
    set_names(input_df$Name)     |>
    as_tibble()

head(out_df, 3)
# # A tibble: 3 × 3
#       A     B     C
#   <int> <int> <int>
# 1   100   250   350
# 2   101   251   351
# 3   102   252   352 

输出是一个与您的循环创建的列表相同的命名列表,在该列表中,我们可以将input_df的第Name列变为set_names(),然后将其变为tibble().

我想你是在试着逐行计算平均值.您可以使用BASE rowMeans()函数来执行以下操作:

out_df   %>% 
    mutate(Average = rowMeans(.))
# # A tibble: 51 × 4
#        A     B     C Average
#    <int> <int> <int>   <dbl>
#  1   100   250   350    233.
#  2   101   251   351    234.
#  3   102   252   352    235.

顺便说一句,你可以在基数R中的一行程序中获得这些方法:

rowMeans(apply(input_df, 1, \(row) seq(row["Start"], row["Stop"])))
# Same output as Average column

如果必须使用循环

作为对您的 comments 的回应,如果您必须使用循环,只需在创建All_list变量时在循环之前设置名称即可.因此,你可以做的不是All_list <- list(),而是:

All_list  <- vector(mode = "list", length = nrow(input_df))  |>
    setNames(input_df$Name)

最好创建一个所需长度的列表,以避免众所周知的性能瓶颈,即在R中增加一个向量.参见第The R Inferno页的第12页.(从那时起,情况有所改善,但在事先知道所需长度的情况下,创建一个列表仍然效率更高.)

R相关问答推荐

如何以编程方式将X轴勾号上的希腊符号合并到R图中?

给定R中另一行中的值,如何插补缺失值

无法将传奇添加到cowplot多情节中

用derrr在R中查找组间的重复项

更改默认系列1以更改名称

修改用R编写的用户定义函数

如何在区分不同条件的同时可视化跨时间的连续变量?

如何使用ggplot对堆叠条形图进行嵌套排序?

如何通过判断数据框的一列来压缩另一列?

按多列统计频次

更改STAT_VALLES/STAT_PEAKS中的箭头线宽/大小

将选定的索引范围与阈值进行比较

有没有一种方法可以同时对rhandsontable进行排序和从rhandsontable中删除?

如何从向量构造一系列双边公式

如何创建累加到现有列累计和的新列?

变长向量的矢量化和

创建在文本字符串中发现两个不同关键字的实例的数据框

如何在Quarto中使用美人鱼图表中的标记来加粗文本

按组使用dummy r获取高于标准的行的平均值

我正在try 创建一个接近cos(X)的值的While循环,以便它在-或+1-E10范围内