r语言 - 作用于列表参数的函数



我正在尝试使用函数减少以下代码,但我的结果有些出乎意料。如果我使用此代码

A <- data.frame(x = c(1,2,3), y = c(4,5,6))
B <- data.frame(x = c(7,8), y = c(1,2))
Lst <- list(A, B) 
names(Lst) <- c('A','B')
idx <- c('A', 'B')
Lst[['A']]['name'] <- 'A' 
Lst[['B']]['name'] <- 'B' 

我得到输出

> Lst
$A
x y name
1 1 4    A
2 2 5    A
3 3 6    A
$B
x y name
1 7 1    B
2 8 2    B

正如预期和要求的那样。我想使用一个函数,而不是,为了使结果更通用,对于进一步的应用程序,使用以下代码:

bad.lst <- mapply(function(lst,x) {
lst[[x]]['name'] <- x
return(lst)
}, Lst, idx)

结果出乎意料

A           B          
x Numeric,3   Numeric,2  
y Numeric,3   Numeric,2  
A Character,3 Character,2

有没有办法修复第二个代码以获得与第一个代码相同的结果?

我们可以使用Map

Lst1 <- Map(cbind, Lst, name = names(Lst))

因为mapply可以返回矩阵,因为默认情况下它使用SIMPLIFY = TRUE

mapply(cbind, Lst, name = names(Lst))
#     A         B        
#x    Numeric,3 Numeric,2
#y    Numeric,3 Numeric,2
#name factor,3  factor,2 

相反,如果我们改变SIMPLIFY = FALSE

mapply(cbind, Lst, name = names(Lst), SIMPLIFY = FALSE)
#$A
#  x y name
#1 1 4    A
#2 2 5    A
#3 3 6    A
#$B
#  x y name
#1 7 1    B
#2 8 2    B

最新更新