将循环应用于r中的列表列表

将循环应用于r中的列表列表,r,list,loops,R,List,Loops,我有数据帧(Jdef),例如: 我已使用以下方法创建了列表列表: 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) spl

我有数据帧(Jdef),例如:

我已使用以下方法创建了列表列表:

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的每个元素添加所有记录,这些记录是在同一个月和同一年(与listJii的每个元素中列出的记录的月和年相同)从Jdef中获取的。我使用了以下方法:

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\u to\u add=list()
用于(1中的i:长度(列表jii)){

数据添加[[i]]这里的问题是
data\u to\u add
是空的。它是空的,因为
listJii[[i]]$Date\u record
不存在。因为列表列表(即嵌套列表)可能比简单列表或数据框更容易混淆,所以需要(从外到内)遍历列表结构的各个层查找所搜索向量的位置。本例中的
Date\u记录在
listJii[[i]][[j]]

如何构建嵌套循环以计算嵌套列表中的向量?

使嵌套循环正确的一个技巧是从内到外工作

步骤1。确保核心功能正常工作,而不使用循环。
使用嵌套列表中的样本向量测试命令行

unique(listJii[[1][[1]]$Date\u record)#这是您要存储在`要添加的数据'中的内容`
#“listJii”中有两层列表,因此需要在“data”中添加两层列表`

数据添加Justa
tidyverse
解决方案:

库(tidyverse)
Jdef%>%
嵌套日期(日期记录)%>%
内部连接(Jdef%>%nest\u by(日期记录、年龄、焦点ID、.key=“focalized”)->nested
每行相当于列表中的一个元素

# A tibble: 1,043 x 5
# Rowwise:  Date_record
   Date_record                 data   Age FocalID             Focalised
   <chr>       <list<tbl_df[,106]>> <dbl> <chr>    <list<tbl_df[,104]>>
 1 10 2018              [262 × 106]    26 Moussaka            [5 × 104]
 2 10 2018              [262 × 106]    27 Moussaka            [2 × 104]
 3 10 2018              [262 × 106]    33 Etosha              [2 × 104]
 4 10 2018              [262 × 106]    34 Etosha              [4 × 104]
 5 10 2018              [262 × 106]    35 Ishiguro            [1 × 104]
 6 10 2018              [262 × 106]    36 Houston             [1 × 104]
 7 10 2018              [262 × 106]    36 Ishiguro            [5 × 104]
 8 10 2018              [262 × 106]    36 Seuss               [1 × 104]
 9 10 2018              [262 × 106]    37 Houston             [4 × 104]
10 10 2018              [262 × 106]    37 Seuss               [5 × 104]
# … with 1,033 more rows
另外,如果您只想获取日期
split
已将这些日期放入元素名称中,因此:

rep(名称(listJii)、长度(listJii))
purrr

listJii%>%map(map,map,`[`,1,“日期记录”)
baseR

lappy(listJii,lappy,lappy,`[`,1,“日期记录”)

某些拆分不是
数据。帧
可能会引发一些错误,这也是
rep
解决方案不等同于
purr | baseR

的原因。请务必使用
dput()
提供一个可复制且易于管理的示例。您好,感谢您的提示。我已经编辑了帖子,按照您的建议,添加了一个指向使用dput()提取的原始df的链接。我看不到它。如果您发布带有
头(,n=10)
左右的一小部分样本,效果会更好。
要添加的数据
是空的,因为
listJii[[I]]$Date_record
不存在。您的数据框位于列表结构的三个级别内,因此您需要深入到列表结构中。例如,要获得唯一的数据记录,您需要更多的循环来处理类似于
listJii[[i][[j][[k]]$Data_record
是的,我曾想象问题是列表的多级结构,但我不知道如何解决它…正如OP已经拆分数据一样。frame在日期上我们现在知道一个事实,即每个拆分都有一个唯一的值,即第一行的值谢谢你@LC datascientist!这是一个非常清楚的例子planation!您认为在新列表“listJ_subs”中可以保持与原始“listJii”中相同的元素名称吗?也就是说,第一个元素级别将具有日期记录名称,第二个元素级别将具有年龄编号,第三个元素级别将具有焦点名称。@VittoriaRoatti replace
Lappy
sapply
@Abdessabour Mtk谢谢!也许我让我自己的生活变得复杂了,但我尝试用for循环而不是Lappy来实现这一点,因为到目前为止,这是一个行之有效的方法。不过,也许你有一个不同的解决方案来“添加”列表中的数据(见我下面的评论)。在“listJ_subs”的for循环中,您可以将
listJ_subs[[i]]
替换为
listJ_subs[[names(listJii)[i]]]]
@vittoriarotti您没有提到要如何“添加”记录很抱歉,可能不清楚。在创建listJii和data_to_add之后,我想向listJii的每个FocalID子元素添加在同一个月和同一年的所有记录。我需要这些记录,因为我将应用社交网络功能,为了分析社交网络随时间的变化,我需要一个列表每个FocalID在每个年龄和日期记录期间都有自己的网络。因此,我想通过循环并使用data to add创建listJ_subs来添加数据,其中包括Jdef中与data to add中在同一个月/年获取的所有记录。此外,您的tidyverse解决方案看起来很棒(而且简单),但输出与我的原始listJii(使用Lappy创建)不同,因此我不确定这是否只是一种不同的列表可视化方式,或者列表结构是否不同…(对不起,我不熟悉列表…)事实上,我应该注意,在这种情况下,“添加”是一个令人困惑的术语,因为我不是在添加,而是用数据填充新列表的一个元素…@vittoriarotti您需要排除具有相同
FocalID
的记录吗?@vittoriarotti我认为您试图做的是多余的,这是因为最后,代码基本上只是复制在该
date_记录中创建的数据;而且聚焦的列的每一行都相当于嵌套列表中的一个元素。
# A tibble: 1,043 x 5
# Rowwise:  Date_record
   Date_record                 data   Age FocalID             Focalised
   <chr>       <list<tbl_df[,106]>> <dbl> <chr>    <list<tbl_df[,104]>>
 1 10 2018              [262 × 106]    26 Moussaka            [5 × 104]
 2 10 2018              [262 × 106]    27 Moussaka            [2 × 104]
 3 10 2018              [262 × 106]    33 Etosha              [2 × 104]
 4 10 2018              [262 × 106]    34 Etosha              [4 × 104]
 5 10 2018              [262 × 106]    35 Ishiguro            [1 × 104]
 6 10 2018              [262 × 106]    36 Houston             [1 × 104]
 7 10 2018              [262 × 106]    36 Ishiguro            [5 × 104]
 8 10 2018              [262 × 106]    36 Seuss               [1 × 104]
 9 10 2018              [262 × 106]    37 Houston             [4 × 104]
10 10 2018              [262 × 106]    37 Seuss               [5 × 104]
# … with 1,033 more rows