考虑以下数据框A
A <- data.frame(ID = c(1,1,1,2,2,2), num = c(6,2,8,3,3,1))
With A
, 我想分开ID
,然后计算差值num
。可以(几乎)获得所需的结果
do.call(rbind, Map(function(x) { x$new <- c(diff(x$num), NA); x },
split(A, A$ID)))
# ID num new
# 1.1 1 6 -4
# 1.2 1 2 6
# 1.3 1 8 NA
# 2.4 2 3 0
# 2.5 2 3 -2
# 2.6 2 1 NA
这不是什么秘密do.call(rbind, ...)
在 R 用户中广泛流行。但随着高阶函数式编程的功能?Map
page (Reduce
, Filter
等),我想可能有一些我不知道的东西可以替代do.call(rbind, ...)
这也将重置该过程中的行名称。我已经尝试过以下方法。
> Reduce(function(x) { x$new <- c(diff(x$num), NA); x }, Map, split(A, A$ID))
# Error in f(init, x[[i]]) : unused argument (x[[i]])
> Reduce(function(x) { x$new <- c(diff(x$num), NA); x }, split(A, A$ID))
# Error in f(init, x[[i]]) : unused argument (x[[i]])
> Reduce(Map(function(x) { x$new <- c(diff(x$num), NA); x }, split(A, A$ID)))
# Error in Reduce(Map(function(x) { :
# argument "x" is missing, with no default
我想要的确切结果是通过以下方式获得的
> M <- do.call(rbind, Map(function(x) { x$new <- c(diff(x$num), NA); x },
split(A, A$ID)))
> rownames(M) <- NULL
> M
# ID num new
# 1 1 6 -4
# 2 1 2 6
# 3 1 8 NA
# 4 2 3 0
# 5 2 3 -2
# 6 2 1 NA
有没有高阶函数可以替代do.call(rbind, ...)
并纳入rownames(x) <- NULL
同时?
注意:我真的在寻找?Map
相关答案,但我对其他人开放。