R 如何通过字符串识别函数使用Lappy向嵌套列表添加新列

R 如何通过字符串识别函数使用Lappy向嵌套列表添加新列,r,list,lapply,R,List,Lapply,我正在尝试使用%in%函数将特定列添加到嵌套在列表列表中的数据帧中。下面是我的数据的一个玩具示例 dput(标题(列表)): 我要添加两组不同的列(数据帧)。二月份到二月份的拘留和三月份到三月份的拘留 dput(头部(2月制动)): dput(头部(马吕拘留)): 我已经成功地使用这些步骤将感兴趣的列添加到数据框(不是嵌套在列表中)。重复项必须从函数中删除,我无法在函数中执行此操作 2月拘留[!重复(2月拘留$学生),]->2月拘留重复 addDetentions <- functio

我正在尝试使用%in%函数将特定列添加到嵌套在列表列表中的数据帧中。下面是我的数据的一个玩具示例

dput(标题(列表)):


我要添加两组不同的列(数据帧)。二月份到二月份的拘留和三月份到三月份的拘留

dput(头部(2月制动)):

dput(头部(马吕拘留)):


我已经成功地使用这些步骤将感兴趣的列添加到数据框(不是嵌套在列表中)。重复项必须从函数中删除,我无法在函数中执行此操作

2月拘留[!重复(2月拘留$学生),]->2月拘留重复

addDetentions <- function(df, df_namecol, detentions,  detention_namecol){
df[which(df_namecol %in% detention_namecol == T),] -> df_v1
detentions[which(detention_namecol %in% df_namecol == T),] -> det_v1
cbind(df_v1, det_v1) -> df_edit
return(df_edit)
}

addDetentions(df = GAME1, df_namecol = rownames(GAME1),
          detentions = Feb_detentions_dup, detention_namecol = Feb_detentions_dup$Pupil) -> output

我想对整个列表执行此功能(或其他有效的功能)。但是由于在一个列表中有两组不同的列要添加到两个不同的嵌套列表中,所以我有点卡住了

lapply(Chars_alive, function(x) {addDetentions(x, rownames(x), Feb_detentions, Feb_detentions$Pupil)})
任何帮助都将不胜感激



一个选项是在
列表
的嵌套data.frames和相应的
列表
之间进行
合并
,创建顺序与名称相同(第一个
列表
的月份名称)<代码>映射是否循环通过相应的
列表
元素

Map(function(x, y) 
   # x is the first list which is a nested one
   # so loop through it
   lapply(x, function(dat) {
      # create a Pupil column from the row names
      dat$Pupil <- row.names(dat)
      # merge with the corresponding 'detentions' dataset
      merge(dat, y)
      }),
      # first list, created list
      lst1, list(Feb_detentions, Mar_detentions)) 
更新 如果我们只需要从'lst1'中更新第二个嵌套的
list
,只需提取
list
元素并执行
merge

Map(function(x, y)  x[[2]] <- {
      x[[2]]$Pupil <- row.names(x[[2]])
     merge(x[[2]], y)
      x
      }, lst1, list(Feb_detentions, Mar_detentions))

Map(函数(x,y)x[[2]]您需要
Map(函数(x,y)lappy(x,函数(dat)吗{dat$PRODUCT@akrun认为这很有效,谢谢。我能问一下x和y是做什么的吗?这两个函数在我的玩具数据集上都起作用,但在我的真实数据上,它在第二个列表中添加了新的列,但在第一个列表中没有。我想这是因为我的两个嵌套列表中的row.names是不同的。它将编辑这个问题,这样更清楚。@Krutike、 您不需要第二个循环,即
lappy
map
,而是执行
x[[2]]
structure(list(GAME1_Class = c("paladin", "fighter", "wizard", 
"sorcerer", "rouge"), GAME1_Race = c("human", "elf", "orc", "human", 
"gnome"), GAME1_Alignment = c("NE", "CG", "CE", "NN", "LG"), 
GAME1_Level = c(6, 7, 6, 7, 7), GAME1_Alive = c("y", "y", 
"y", "y", "y"), Pupil = c("m.Stan", "m.Kenny", "m.Cartman", "m.Kyle", 
"m.Butters"), Detention = c("y", "y", "n", "n", "y")), row.names =  c("m.Stan", "m.Kenny", "m.Cartman", "m.Kyle", "m.Butters"), class = "data.frame")
lapply(Chars_alive, function(x) {addDetentions(x, rownames(x), Feb_detentions, Feb_detentions$Pupil)})
Map(function(x, y) 
   # x is the first list which is a nested one
   # so loop through it
   lapply(x, function(dat) {
      # create a Pupil column from the row names
      dat$Pupil <- row.names(dat)
      # merge with the corresponding 'detentions' dataset
      merge(dat, y)
      }),
      # first list, created list
      lst1, list(Feb_detentions, Mar_detentions)) 
library(tidyverse)
map2(lst1, list(Feb_detentions, Mar_detentions),
       ~ {
         ydat <- .y
         map(.x, ~ .x %>%
                    rownames_to_column("Pupil") %>% 
                    inner_join(ydat))
         })
Map(function(x, y)  x[[2]] <- {
      x[[2]]$Pupil <- row.names(x[[2]])
     merge(x[[2]], y)
      x
      }, lst1, list(Feb_detentions, Mar_detentions))