【发布时间】:2020-11-20 15:24:51
【问题描述】:
我有数据框(Jdef),例如:
FocalID Sex Date Time Year_record Month_record Age Date_record
Adelaide F 2014-06-22 07:41:04 2014 6 103 6 2014
Adelaide F 2015-08-22 11:53:17 2015 8 117 8 2015
Adelaide F 2014-06-16 12:30:18 2014 6 103 6 2014
Adelaide F 2014-06-11 11:58:28 2014 6 103 6 2014
Adelaide F 2014-07-05 14:10:23 2014 7 104 7 2014
Adelaide F 2014-06-20 11:41:34 2014 6 103 6 2014
Adelaide F 2014-06-04 09:39:34 2014 6 103 6 2014
Adelaide F 2015-09-24 14:21:51 2015 9 119 9 2015
Adelaide F 2015-08-15 13:09:07 2015 8 117 8 2015
Adelaide F 2015-09-16 09:06:16 2015 9 118 9 2015
我使用以下方法创建了一个列表列表:
Jdef$Date_record = paste(Jdef$Month_record, Jdef$Year_record)
listJ = split(Jdef, Jdef$Date_record)
listJi = lapply(listJ, function(x) split(x, x$Age))
listJii = lapply(listJi, function(x) sapply(x, function(x) split(x, x$FocalID)))
现在我想向listJii 的每个元素添加从Jdef 中获取的同一月份和年份(与listJii 的每个元素中列出的记录相同的月份和年份)的所有记录。我使用了以下内容:
data_to_add = list()
for(i in 1:length(listJii)){
data_to_add[[i]] <- unique(listJii[[i]]$Date_record)
}
listJ_subs = list()
for(i in 1:length(data_to_add)){
listJ_subs[[i]] <- subset(Jdef, Jdef$Date_record %in% data_to_add[[i]])
}
但是,循环不起作用,表示索引超出范围(data_to_add 列表结果为空)。我不明白为什么。这是否与 listJii 是列表列表这一事实有关??
【问题讨论】:
-
请务必使用
dput()提供可重现且易于管理的示例。 -
您好,感谢您的提示。正如您所建议的,我已经编辑了帖子,添加了指向使用 dput() 提取的原始 df 的链接。
-
我看不到。最好用
head( , n = 10)左右发布一小部分样本。 -
data_to_add为空,因为listJii[[i]]$Date_record不存在。您的数据框位于列表结构的三个级别内,因此您需要更深入地了解列表结构。例如,要获得唯一的数据记录,您需要更多的 for 循环来处理listJii[[i]][[j]][[k]]$Data_record之类的内容 -
是的,我一直以为问题是列表的多级结构,但我不知道如何解决它......