Stack Overflow上有多种与此相关的问题,但我找不到解决我的问题的答案,如下所述。
假设我有一个包含两列的数据框(或tibble),比如df
,其中包括X1
和X2
。我有一个函数,比如f
,它接受输入X1
和X2
,并输出一个向量,比如[V1,V2]
。
现在,如果输出是单例,那么我就可以写成
df %>% mutate(V = f(X1,X2))
我想在我的 df
中添加一个标为 V
的列,其值将为 f(X1,X2)
。但是,我希望添加 两个 列,即 V1
和 V2
。我不知道如何做到这一点。
当然,我可以这样做:
df %>% mutate(V1 = f(X1,X2)[1], V2 = f(X1,X2)[2]),
但是这个(我假设)涉及到两次调用函数f
。我的数据集很大,不想调用两次。
另一种选择是
df %>% mutate(V_list = as.list(f(X1,X2)), V1 = V_list[[1]], V2 = V_list[[2]]) %>% select(-V_list),
但这似乎是一种相当笨重的方法,我宁愿不用。
此外,我最终想要将其应用于一个group
ed tibble,因此用朴素的方法编写将会为组中的每个条目重复V_list
。因此,理想情况下,任何答案都应该是“可向量化的”,具体如下所述。
假设我已经执行了df %>% group_by(var1)
并且有一个函数f
,它将带有两列的数据框作为输入——这应该被视为“一对向量”,然后输出一个具有两个列的新数据框。
这里是一些设置示例的代码。
library(dplyr)
df = tibble(var1 = c(1,1,2,2), X1 = c(1,2,3,4), X2 = c(5,6,7,8))
f = function(sub_df, var){ return( data.frame(x1 = (x1+x2)^var, x2 = (x1-x2)^var) ) }
f
,也许我想要使用group_by(var1)
,然后对来自于X1
和X2
(比如说X1 ~ X2
)的数据进行lm
拟合;从中,我想要提取出这两个系数。这意味着我最终得到的将是一个有两行三列的数据框:var1
,coeff1
和coeff2
。 - Sam OT