如何在R中按规则将数据框行依次存入两个列表?
实现方法
先明确规则(结合你给出的代码示例修正描述冲突:my_list_2实际每次取5行,若最后一次不足5行则取剩余所有行):
my_list_1:始终从第1行开始,初始取10行,之后每次新增5行(结束行依次为10、15、20...)my_list_2:从my_list_1当前元素的结束行的下一行开始,每次取5行,直到所有数据处理完毕
以下是鲁棒性较强的R代码实现:
# 设置随机种子保证结果可复现 set.seed(123) # 生成原始数据框 my_data = data.frame(id = 1:100, var = rnorm(100,100,100)) # 获取数据总行数 n <- nrow(my_data) # 生成my_list_1的结束行序列:从10开始,每次加5,直到下一个结束行的下一行不超过总行数 end1_seq <- seq(from = 10, to = n - 1, by = 5) # 生成训练集列表my_list_1 my_list_1 <- lapply(end1_seq, function(x) { my_data[1:x, ] }) # 生成测试集列表my_list_2 my_list_2 <- lapply(end1_seq, function(x) { test_start <- x + 1 test_end <- min(x + 5, n) my_data[test_start:test_end, ] })
代码验证
可以通过以下代码检查前几个元素是否符合要求:
# 查看my_list_1第一个元素的行范围 range(my_list_1[[1]]$id) # 输出 1 10 # 查看my_list_2第一个元素的行范围 range(my_list_2[[1]]$id) # 输出 11 15 # 查看my_list_1第二个元素的行范围 range(my_list_1[[2]]$id) # 输出 1 15 # 查看my_list_2第二个元素的行范围 range(my_list_2[[2]]$id) # 输出 16 20 # 查看最后一组的行范围 range(my_list_1[[length(my_list_1)]]$id) # 输出 1 95 range(my_list_2[[length(my_list_2)]]$id) # 输出 96 100
适配非5倍数的总行数
如果你的数据总行数不是5的倍数(比如97行),代码会自动处理最后一组测试集:
my_list_1最后一个元素取1:95行my_list_2最后一个元素取96:97行(剩余的2行)
内容的提问来源于stack exchange,提问作者stats_noob
相关产品推荐
相关产品推荐

