首页 > 解决方案 > R中长格式数据框中的多变量函数

问题描述

为宽格式数据帧计算多个变量的函数非常熟悉:

library(tidyverse)
df <- tibble(t = 1:3, b = 11:13, c = 21:23) 
df <- df %>% mutate(d = b + c) # or base R: df$d <- df$b + df$c

当数据帧是长格式时呢?例如

df <- df %>% pivot_longer(-t, names_to = "variable", values_to = "value")

在这种长格式中,您可以想象首先执行相同的操作group_by(t),然后为每个组计算一个 d 值,即该组的 variable=b 值加上该组的 variable=c 值。这可能吗?人们可能会想到类似的东西,summarise(d = b + c)但它需要宽格式。
注意,我的真实示例有两个以上的列 b 和 c,我想将它们放入定义的函数中,而不仅仅是添加它们。我的工作解决方案是将一个巨大的数据框从长旋转到宽,调用我的多变量函数来定义一个新列,然后旋转回长。
编辑:为了使现实世界的例子更明确,我需要调用一个定义的函数,它以不同的方式处理它的参数,不像sum. 例如

my.func <- function(b, c) { b^c }

如何通过将此函数应用于与 t 的相同值相关联的 b 和 c 的值来计算变量 d?

标签: rdplyr

解决方案


我们可以做sum而不是+

library(dplyr)
library(tidyr)
df %>% 
    group_by(t) %>% 
    summarise(d =sum(value[variable %in% c('b', 'c')]))

如果是应用my.func,我们需要提取对应 'b', 'c' 的值

df %>% 
    group_by(t)  %>%
    mutate(new = my.func(value[variable == 'b'], value[variable == 'c']))

推荐阅读