gpt4 book ai didi

r - do.call(rbind, ...) 有更高阶的替代品吗?

转载 作者:行者123 更新时间:2023-12-02 08:32:07 26 4
gpt4 key购买 nike

考虑以下数据框 A

A <- data.frame(ID = c(1,1,1,2,2,2), num = c(6,2,8,3,3,1))

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, ...) 已经不是什么 secret 了在 R 用户中广受欢迎。但是在 ?Map 上使用高阶函数式编程函数页面( ReduceFilter 等),我认为可能有一些我不知道的东西可以替代 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相关答案,但对其他人开放。

最佳答案

你可以从“data.table”中查看rbindlist:

library(data.table)

rbindlist(Map(function(x) {
x$new <- c(diff(x$num), NA)
x}, split(A, A$ID)))
# 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

然而,纯粹的“data.table”方法更为直接:

DT <- as.data.table(A)

DT[, new := c(diff(num), NA), by = ID][]
# 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

关于r - do.call(rbind, ...) 有更高阶的替代品吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25553955/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com