R 使用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

我正在使用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), 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]]