【问题标题】:Add new rows in list of lists with conditions in R在具有 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) 提供您的数据

标签: r for-loop rbind


【解决方案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 列,它应该如何工作,如果你告诉我模式是什么,那么我将能够概括它
  • 如果你看一下我上面得到的矩阵,我已经展示了模式。我也写出来了
  • 如何对数据框列表执行此计算?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-05
  • 2011-08-23
  • 1970-01-01
  • 1970-01-01
  • 2020-04-30
相关资源
最近更新 更多