R 使用lappy保留输入列表的名称
我正在使用lappy对列表列表执行一个函数。外部列表中的子列表已命名,我希望能够访问这些内部列表的名称,以便对其执行一些条件逻辑。下面让我介绍一下我的尝试:R 使用lappy保留输入列表的名称,r,R,我正在使用lappy对列表列表执行一个函数。外部列表中的子列表已命名,我希望能够访问这些内部列表的名称,以便对其执行一些条件逻辑。下面让我介绍一下我的尝试: # dput of my sample data main_list <- structure(list(sublist1 = structure(list(df1 = structure(list( X1 = 0, X2 = 0), .Names = c("X1", "X2"), row.names = c(NA, -1L
# dput of my sample data
main_list <- structure(list(sublist1 = structure(list(df1 = structure(list(
X1 = 0, X2 = 0), .Names = c("X1", "X2"), row.names = c(NA,
-1L), class = "data.frame"), df2 = structure(list(X1 = 0, X2 = 0), .Names = c("X1",
"X2"), row.names = c(NA, -1L), class = "data.frame")), .Names = c("df1",
"df2")), sublist2 = structure(list(df3 = structure(list(X1 = 0,
X2 = 0), .Names = c("X1", "X2"), row.names = c(NA, -1L), class = "data.frame"),
df4 = structure(list(X1 = 0, X2 = 0), .Names = c("X1", "X2"
), row.names = c(NA, -1L), class = "data.frame")), .Names = c("df3",
"df4"))), .Names = c("sublist1", "sublist2"))
因此,每个内部列表的名称是sublist1
和sublist2
,然后这些子列表中的每个都包含两个数据帧
所需输出(已编辑)
我希望能够访问子列表的名称,即在lappy期间使用的函数中的sublist1
和sublist2
。我编辑了示例函数以获得更清晰的所需输出:
> example <- function(input){
+ if(names(input)=="sublist1"){
+ return(1)
+ } else{
+ return(2)
+ }
+ }
> lapply(main_list,example)
$sublist1
[1] 2
$sublist2
[1] 2
Warning messages:
1: In if (names(input) == "sublist1") { :
the condition has length > 1 and only the first element will be used
2: In if (names(input) == "sublist1") { :
the condition has length > 1 and only the first element will be used
尝试
以下是我的一些失败尝试:
> lapply(main_list,names)
$sublist1
[1] "df1" "df2"
$sublist2
[1] "df3" "df4"
> lapply(main_list,colnames)
$sublist1
NULL
$sublist2
NULL
> test <- function(input){
print(substitute(input))
}
> lapply(main_list,test)
X[[i]]
X[[i]]
$sublist1
X[[i]]
$sublist2
X[[i]]
lapply(主列表、名称)
$sublist1
[1] “df1”“df2”
$sublist2
[1] “df3”“df4”
>lapply(主列表、列名称)
$sublist1
无效的
$sublist2
无效的
>测试层(主列表,测试)
X[[i]]
X[[i]]
$sublist1
X[[i]]
$sublist2
X[[i]]
我可以看到
$sublist1
和$sublist2
出现在我的尝试中,但我在实际存储这些值并根据这些值执行操作时遇到了问题。您能否更具体地说明所需的输出,而不是仅仅给出伪代码?一个明显的选择是循环。另一个是Map(f,L,names(L))
和f
按您的需要编写。是否有效:我没有用您的数据尝试过:names(input)
不会返回“sublist1”
,除非input
是主列表
,就像name(mtcars)
返回“mpg”“cyl”…
,不是“mtcars”
。因此,跳过lappy
,因为您不需要进入列表。您可以使用ifelse
对相等性检查进行矢量化(if
未进行矢量化),但恼人的是ifelse
会剥离属性,包括名称,因此需要重新添加它们。使用magrittr
管道以便顺序明确:ifelse(名称(主列表)=='sublist1',列表(1),列表(2))%>%setNames(名称(主列表))
。编辑,将其包装在函数中,等等。可能类似于mapply(函数(lst,nm){if(nm==“sublist1”)…},main_list,names(main_list))
?您是否可以更具体地描述所需的输出,而不是只给出伪代码?一个明显的选择是循环。另一个是Map(f,L,names(L))
和f
按您的需要编写。是否有效:我没有用您的数据尝试过:names(input)
不会返回“sublist1”
,除非input
是主列表
,就像name(mtcars)
返回“mpg”“cyl”…
,不是“mtcars”
。因此,跳过lappy
,因为您不需要进入列表。您可以使用ifelse
对相等性检查进行矢量化(if
未进行矢量化),但恼人的是ifelse
会剥离属性,包括名称,因此需要重新添加它们。使用magrittr
管道以便顺序明确:ifelse(名称(主列表)=='sublist1',列表(1),列表(2))%>%setNames(名称(主列表))
。编辑,将其包装在函数中,等等。可能类似于mapply(函数(lst,nm){if(nm==“sublist1”)…},主列表,名称(主列表))
?
> lapply(main_list,example)
$sublist1
[1] 1
$sublist2
[1] 2
> lapply(main_list,names)
$sublist1
[1] "df1" "df2"
$sublist2
[1] "df3" "df4"
> lapply(main_list,colnames)
$sublist1
NULL
$sublist2
NULL
> test <- function(input){
print(substitute(input))
}
> lapply(main_list,test)
X[[i]]
X[[i]]
$sublist1
X[[i]]
$sublist2
X[[i]]