如何解决将函数应用于与数据框中的值匹配的列表元素
我有一个名为 a、b 和 c 的数据框列表(mylist)。我想对每个数据帧的第一个变量 (var1) 的每个值应用一个简单的加法,对应于来自单独数据帧 (shift_df) 的(匹配)值,其中包含变量“id”(b、a、c )和“移位”(2.1、4.5、6.6)。换句话说,我想获得一个列表,其中 mylist$b$var1 中的每个值都由 2.1 等添加。
mylist <- list("a" = data.frame("var1" = c(1,2,3),"var2" = c(9,3,5)),"b" = data.frame("var1"= c(2,4,7),"var2" = c(5,1,"c" = data.frame("var1" = c(8,5,6),3)))
shift_df <- data.frame("id"=c("b","a","c"),"shift"=c(2.1,4.2,6.6))
我的想法是为此使用 lapply,但我无法正确应用与 shift_df$id 的匹配。感谢您的帮助!
lapply(mylist,function(x) {x[names(mylist)==shift_df[1]] + shift_df$shift[names(mylist)==shift_df[1]]})
解决方法
data.table
方法。
首先,将列表连接在一起,使用列表元素的名称作为 id。
然后执行更新连接,将每个 id 的 Shoft_df 值添加到 val1 和 val2。
最后,通过 id 将 data.table 拆分回一个列表。
library(data.table)
split( rbindlist(mylist,idcol = "id")[setDT(shift_df),`:=`(var1 = var1 + i.shift,var2 = var2 + i.shift),on = .(id)],by = "id",keep.by = FALSE)
# $a
# var1 var2
# 1: 5.2 13.2
# 2: 6.2 7.2
# 3: 7.2 9.2
#
# $b
# var1 var2
# 1: 4.1 7.1
# 2: 6.1 3.1
# 3: 9.1 7.1
#
# $c
# var1 var2
# 1: 14.6 11.6
# 2: 11.6 9.6
# 3: 12.6 9.6
,
您可以在基础 R 中使用 Map
-
Map(`+`,mylist,shift_df$shift[match(names(mylist),shift_df$id)])
#$a
# var1 var2
#1 5.2 13.2
#2 6.2 7.2
#3 7.2 9.2
#$b
# var1 var2
#1 4.1 7.1
#2 6.1 3.1
#3 9.1 7.1
#$c
# var1 var2
#1 14.6 11.6
#2 11.6 9.6
#3 12.6 9.6
其中 match
返回需要添加到列表中每个数据帧的 shift
值。
shift_df$shift[match(names(mylist),shift_df$id)]
#[1] 4.2 2.1 6.6
,
使用 imap
library(purrr)
imap(mylist,~ .x + with(shift_df,shift[id == .y]))
$a
var1 var2
1 5.2 13.2
2 6.2 7.2
3 7.2 9.2
$b
var1 var2
1 4.1 7.1
2 6.1 3.1
3 9.1 7.1
$c
var1 var2
1 14.6 11.6
2 11.6 9.6
3 12.6 9.6
或将 map2
与 split
map2(mylist,split(shift_df$shift,shift_df$id),`+`)
或者用pmap
pmap(shift_df,~ mylist[[..1]] + ..2)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。