减少 R 中函数的额外参数
Reduce with extra arguments to the function in R
我正在尝试使用 R 中的 Reduce
函数跨多个数据帧使用 merge
函数。问题是,我想使用带有参数 all=T
的合并函数,但似乎没有地方可以在高阶 Reduce
函数中指定它。
所以我想:
a <- data.frame(id=c(1, 2, 3, 4), a=c('a', 'b', 'c', 'd'))
b <- data.frame(id=c(1, 2, 5, 6), b=c('a', 'b', 'e', 'f'))
c <- data.frame(id=c(3, 4, 5, 6), c=c('c', 'd', 'e', 'f'))
out <- Reduce(merge, list(a, b, c), all=T)
out
id a b c
1 1 a a <NA>
2 2 b b <NA>
3 3 c <NA> c
4 4 d <NA> d
5 5 <NA> e e
6 6 <NA> e e
但是因为 merge
默认为 all=F
,我得到的是:
[1] id a b c
<0 rows> (or 0-length row.names)
据我所知,Reduce
还不能处理传递给函数参数的额外参数。但是你可以用自定义参数重新定义 merge
函数并将其作为匿名函数传递给 Reduce
:
Reduce(function(x, y) merge(x, y, by = "id", all = T), list(a, b, c))
# id a b c
#1 1 a a <NA>
#2 2 b b <NA>
#3 3 c <NA> c
#4 4 d <NA> d
#5 5 <NA> e e
#6 6 <NA> f f
我正在尝试使用 R 中的 Reduce
函数跨多个数据帧使用 merge
函数。问题是,我想使用带有参数 all=T
的合并函数,但似乎没有地方可以在高阶 Reduce
函数中指定它。
所以我想:
a <- data.frame(id=c(1, 2, 3, 4), a=c('a', 'b', 'c', 'd'))
b <- data.frame(id=c(1, 2, 5, 6), b=c('a', 'b', 'e', 'f'))
c <- data.frame(id=c(3, 4, 5, 6), c=c('c', 'd', 'e', 'f'))
out <- Reduce(merge, list(a, b, c), all=T)
out
id a b c
1 1 a a <NA>
2 2 b b <NA>
3 3 c <NA> c
4 4 d <NA> d
5 5 <NA> e e
6 6 <NA> e e
但是因为 merge
默认为 all=F
,我得到的是:
[1] id a b c
<0 rows> (or 0-length row.names)
据我所知,Reduce
还不能处理传递给函数参数的额外参数。但是你可以用自定义参数重新定义 merge
函数并将其作为匿名函数传递给 Reduce
:
Reduce(function(x, y) merge(x, y, by = "id", all = T), list(a, b, c))
# id a b c
#1 1 a a <NA>
#2 2 b b <NA>
#3 3 c <NA> c
#4 4 d <NA> d
#5 5 <NA> e e
#6 6 <NA> f f