【问题标题】:Is there an R function which removes an element of a list and stores all elements in another list是否有一个 R 函数可以删除列表中的一个元素并将所有元素存储在另一个列表中
【发布时间】:2019-10-21 13:20:03
【问题描述】:

我在一个列表中有 3 个数据集,我想使用测试和训练数据的所有组合来构建一个模型。例如:

  • 模型 1:训练数据 - 1,2,测试数据 - 3
  • 模型 2:训练数据 - 1,3,测试数据 - 2
  • 模型 3:训练数据 - 2,3,测试数据 - 1

我现在使用的方法既费力又不聪明。这是一个例子,我的问题是,我怎样才能自动化这个过程?

Day1 <- data.frame(x = c(1,2,3))
Day2 <- data.frame(x = c(4,5,6))
Day3 <- data.frame(x = c(7,8,9))

Days <- list(Day1,Day2,Day3)

Test <- list()
Train <- list()

Train[[1]] <- bind_rows(Day1, Day2)
Test[[1]] <- Day3
Train[[2]] <- bind_rows(Day1,Day3)
Test[[2]] <- Day2
Train[[3]] <- bind_rows(Day2,Day3)
Test[[3]] <- Day1

【问题讨论】:

    标签: r combinations permutation


    【解决方案1】:

    我们可以使用combn 创建所有索引组合,然后使用lapplyTrain 选择这些元素并从Test 中删除这些元素。

    train_inds <- combn(seq_along(Days), 2, simplify = FALSE)
    Train <- lapply(train_inds, function(x) dplyr::bind_rows(Days[x]))
    Test <- lapply(train_inds, function(x) dplyr::bind_rows(Days[-x]))
    

    检查输出

    Train
    #[[1]]
    #  x
    #1 1
    #2 2
    #3 3
    #4 4
    #5 5
    #6 6
    
    #[[2]]
    #  x
    #1 1
    #2 2
    #3 3
    #4 7
    #5 8
    #6 9
    
    #[[3]]
    #  x
    #1 4
    #2 5
    #3 6
    #4 7
    #5 8
    #6 9
    
    Test
    #[[1]]
    #  x
    #1 7
    #2 8
    #3 9
    
    #[[2]]
    #  x
    #1 4
    #2 5
    #3 6
    
    #[[3]]
    #  x
    #1 1
    #2 2
    #3 3
    

    【讨论】:

    • 谢谢。您最初使用 sapply 作为测试列表,但现在您已将其更改为 lapply。有什么理由吗?两者都给出相同的答案,但使用 lapply,您的结构将是列表中的列表。
    • @Ali 如果您在Test 中始终只有一个数据框(如本例所示)sapply 应该没问题。但是,如果Test 中可能有多个数据框,那么您需要将lapplybind_rows 一起使用。
    猜你喜欢
    • 2015-04-24
    • 2011-05-11
    • 1970-01-01
    • 2022-01-06
    • 2017-05-02
    • 2022-11-13
    • 2021-08-24
    • 1970-01-01
    相关资源
    最近更新 更多