gpt4 book ai didi

r - 根据列表项的行拆分列表

转载 作者:行者123 更新时间:2023-12-01 08:18:12 24 4
gpt4 key购买 nike

我正在尝试将我的数据框列表拆分为某种子组,例如嵌套列表或多个列表。拆分应该基于每个数据帧的行数,因此具有相同行数的数据帧应该在同一个列表中结束。

full_list <- list(
df1 = replicate(10, sample(0:1, 10, replace = TRUE)),
df2 = replicate(10, sample(0:1, 15, replace = TRUE)),
df3 = replicate(10, sample(0:1, 20, replace = TRUE)),
df4 = replicate(10, sample(0:1, 10, replace = TRUE))
)

现在有两个 nrow() == 10 的数据框,所以它们应该在自己的列表或子列表中结束

我试过类似的方法,但我认为 split 不适用于列表:

sublist <- lapply(full_list, function(x) split(full_list, f = nrow(x)))

顺便说一句:更大的目标是将所有数据帧拆分为机器学习的训练和测试数据集,具有以下功能。 sample 将用于创建子集,但我想要相同长度的数据帧使用相同的 sample_vector。因此,我想事先将完整列表拆分为子列表。之后,我将再次将所有数据帧放在一起进行进一步处理(一种拆分 - 应用 - 组合)。只是提一下我在这里是否可能使事情过于复杂。

# function to split data frames in each sub list into train and test data frames 
counter <- 0
train_test_list <- list()
for (x_table in sublist) {
counter <- counter + 1
current_name <- paste(names(sublist)[counter], sep = "_")

sample_vector <- sample.int(n = nrow(x_table),
size = floor(0.8 * nrow(x_table)), replace = FALSE)
train_set <- x_table[sample_vector, ]
test_set <- x_table[-sample_vector, ]

train_test_list[[current_name]] <- list(
train_set = train_set, test_set = test_set,
table_name = names(sublist)[counter]
)
}
# combine all lists with test and train pairs back into one list
full_train_test_list <- c(train_test_list1, train_test_list2, train_test_list3, ...)

最佳答案

我们可以根据该信息使用sapplysplit 获取行数

new_list <- split(full_list, sapply(full_list, nrow))
str(new_list)
#List of 3
# $ 10:List of 2
# ..$ df1: int [1:10, 1:10] 1 0 0 1 1 0 1 0 0 1 ...
# ..$ df4: int [1:10, 1:10] 1 0 1 1 1 0 0 0 1 1 ...
# $ 15:List of 1
# ..$ df2: int [1:15, 1:10] 0 1 1 0 0 0 0 0 0 1 ...
# $ 20:List of 1
# ..$ df3: int [1:20, 1:10] 1 1 0 1 0 1 1 1 0 1 ...

因为它是一个嵌套的list,我们可以在第一个lapply中调用lapply在内部list中进行处理

traintestlst <- lapply(new_list, function(sublst) lapply(sublst, function(x_table) {

sample_vector <- sample.int(n = nrow(x_table),
size = floor(0.8 * nrow(x_table)), replace = FALSE)
train_set <- x_table[sample_vector, ]
test_set <- x_table[-sample_vector, ]
list(train_set = train_set, test_set = test_set)


})
)

-检查输出

traintestlst[[1]]$df1
#$train_set
# [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
#[1,] 1 1 0 1 0 0 1 1 1 0
#[2,] 1 0 1 1 1 0 0 0 1 0
#[3,] 0 1 0 0 1 1 0 1 1 0
#[4,] 1 1 0 1 0 0 1 0 0 1
#[5,] 0 0 0 1 0 0 1 0 1 0
#[6,] 0 1 1 0 1 0 1 0 1 0
#[7,] 1 0 1 1 0 0 0 0 0 1
#[8,] 0 1 0 0 0 1 0 0 1 0

#$test_set
# [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
#[1,] 0 0 0 0 0 1 0 1 0 1
#[2,] 1 0 0 0 0 0 0 1 1 0

关于r - 根据列表项的行拆分列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59583018/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com