【问题标题】:Mutate or equivalent to add multiple columns returned from a function in R [duplicate]变异或等效添加从R中的函数返回的多个列[重复]
【发布时间】:2018-07-02 23:21:28
【问题描述】:

我试图弄清楚如何添加从一个函数返回的多个列,该函数从同一数据帧中获取一个或多个列作为输入 - 基本上,我想要变异,但可以选择 left_join() 一个数据帧。我可以使用 left_join() 或 cbind() 来做到这一点,但必须有更好的方法。

我使用的实际代码是获取收入、成本、资本支出和其他信息的列,并计算税收和其他财政政策输出。因为它们是相互依赖的,所以我需要在一个函数中完成这一切(我不能一次只做一个变量)而且我真的不想多次调用同一个函数然后按列进行变异(尽管我可以也这样做)。

这是我想做的一个非常简单的例子(人为的):

library(tidyverse)
library(lubridate)
library(nycflights13)
#small data frame of new years day flights from JFK
df1<-flights %>% filter(year==2013,month==1,day==1,origin=="JFK")  
#test function
arr_gate_time<-function(time){
  dep<-time
  gate<-time-hours(1)
  check_in<-time-hours(2)
  data.frame(gate,check_in)
}

我想要做的是,在 mutate 中,做这样的事情:

df_test_2<- df1 %>% mutate(SOMETHING=arr_gate_time(dep_time))

但是,我能得到的最接近的是

df_test<-arr_gate_time(df1$time_hour) 
df_test_2<-cbind(df1,df_test)

我确信有一个简单的 dplyr 实现可以做到这一点,但我不知道正确的命令结构。

谢谢!

【问题讨论】:

  • SOMETHING 我认为你的意思更像sk-learn / pandas 风格的SOMETHING1, SOMETHING2 = 对吧?
  • 是的,或者一些类似的语法 - 我希望它将两列附加到数据框中。
  • df_test_2 &lt;- df1 %&gt;% cbind(arr_gate_time(.$time_hour)) 怎么样?变异更好吗?
  • @Ryan,可能就是这么简单!我不知道我可以跨管道绑定。
  • 你可以通过管道进入任何函数!

标签: r dplyr


【解决方案1】:

tidyverse解决方案

library(tidyverse)
df_test_2 <- df1 %>% bind_cols(arr_gate_time(.$time_hour))

Base R(修改原始数据框)

df1[c('gate', 'check_in')] <- arr_gate_time(df1$time_hour)

data.table(修改原始数据框)

library(data.table)
setDT(df1)
df1[, c('gate', 'check_in') := arr_gate_time(time_hour)]

【讨论】:

  • 谢谢,@Ryan。您是否知道 tidyverse 与 Base R 解决方案是否一定会更快?除非很明显,否则我将使用我的真实代码进行测试。
  • 我相信tidyverse 解决方案会复制df1,即使您将其分配回df1,因此在这种情况下Base 方法应该更快。
  • 我不是 100% 确定。你可以用microbenchmark 包做一些测试。我会对这些数据进行时间比较并发布它,但是这个数据太小了。
  • cbind的tidyverse版本是bind_cols
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-22
  • 2021-01-29
  • 1970-01-01
  • 2012-02-14
相关资源
最近更新 更多