我正在尝试使用函数减少以下代码,但我的结果有些出乎意料。如果我使用此代码
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