在具有 R 条件的列表列表中添加新行

Posted

技术标签:

【中文标题】在具有 R 条件的列表列表中添加新行【英文标题】:Add new rows in list of lists with conditions in R 【发布时间】:2022-01-14 10:41:58 【问题描述】:

我有一个列表列表 testFrame,看起来像:

d1 <- data.frame(var1 = c(10, 7), var2 = c(20,2), var3 = c(30,1))
d2 <- data.frame(var1 = c(20,1), var2 = c(30,2), var3 = c(40,3))
testFrame <- list(d1, d2)
[[1]]
    var1 var2 var3
  1   10   20   30
  2    7    2    1

[[2]]
    var1 var2 var3
  1   20   30   40
  2    1    2    3

我想在每个列表中添加两个新行,如果它是列表中的第一列,则第 3 行将是第 1 行和第 2 行之间的最大值,第 4 行是最小值。否则,第三行将是上一列第四行的数字,第四行是该数字减去该列的最小数字。

结果应该是这样的:

[[1]]
    var1 var2 var3
  1   10   20   30
  2    7    2    1
  3   10    7    5
  4    7    5    4

[[2]]
    var1 var2 var3
  1   20   30   40
  2    1    2    3
  3   20    1   -1
  4    1   -1   -4

到目前为止,我已经

addRows<- lapply (testFrame,
                  function(x)
                    for(i in 1:3) 
                     if (i==1) rbind.......
                     else 
                       rbind(.........)
                     
                    
                   )  

我不知道要在 rbind 中放入什么。

【问题讨论】:

您能否提供您的清单,以便我以它们为例? 使用dput(x) 提供您的数据 【参考方案1】:
my_df <- data.frame("var1" = c(10, 7),
                "var2" = c(20, 2),
                "var3" = c(30, 1),
                "var4" = c(40, 7),
                stringsAsFactors = FALSE)

my_df2 <- data.frame("var1" = c(10, 18),
                 "var2" = c(20, 2),
                 "var3" = c(30, 1),
                 "var4" = c(40, 7),
                 stringsAsFactors = FALSE)

my_df3 <- data.frame("var1" = c(10, 20),
                 "var2" = c(20, 2),
                 "var3" = c(30, 1),
                 "var4" = c(40, 7),
                 stringsAsFactors = FALSE)

my_list <- list(my_df, my_df2, my_df3)

my_third <- function(x, y) 
if (x == 1) 
my_result <- max(my_list[[y]]$var1)
 else if (x == 2) 
my_result <- my_list[[y]][2, 1]
 else 
my_result <- my_list[[y]][2, x - 2] - my_list[[y]][2, x - 1]

return (my_result)

my_fourth <- function(x, y) 
if (x == 1) 
my_result <- min(my_list[[y]]$var1)
 else 
my_result <- my_list[[y]][3, x] - my_list[[y]][2, x]

return (my_result)

my_f <- function(y) 
my_a <- lapply(1:ncol(my_list[[y]]), function(x) my_third(x, y))
my_list[[y]] <<- rbind(my_list[[y]], my_a)
my_a <- lapply(1:ncol(my_list[[y]]), function(x) my_fourth(x, y))
my_list[[y]] <<- rbind(my_list[[y]], my_a)

my_list2 <- lapply(1:length(my_list), my_f)
my_list2[[1]]
my_list2[[2]]
my_list2[[3]]

编辑:更改代码以便它可以处理数据框列表

【讨论】:

如果有多个列,这将如何工作?这就是我放置 for 循环的原因,所以我不需要硬编码数字。 嗯,这取决于你的期望,如果你有 4 列,它应该如何工作,如果你告诉我模式是什么,那么我将能够概括它 如果你看一下我上面得到的矩阵,我已经展示了模式。我也写出来了 如何对数据框列表执行此计算?

以上是关于在具有 R 条件的列表列表中添加新行的主要内容,如果未能解决你的问题,请参考以下文章

如何在具有现有记录的 json 数据表顶部添加新行

在列表视图中添加倒数计时器会在每个新行中重新启动

如何在R中的一列中添加具有不同值的新行

迭代循环并将列表添加到新行或新列中的数据框

向 QAbstractListModel 子类添加新行时,QML 视图不会更新

在DynamoDB中保存一个新行,然后列出所有那些具有最终读取一致性的项目?