小编k13*_*k13的帖子

如何在R中有效地部分应用函数?

假设我在R中有一个带有多个参数的函数,我想通过将一些参数设置为预先指定的值来将其减少为参数较少的函数.我试图找出最好的方法是在R.

例如,假设我有一个功能

f <- function(a,b,c,d){a+b+c+d}
Run Code Online (Sandbox Code Playgroud)

我想创建或找到一个函数partial,它将执行以下操作

partial <- function(f, ...){
#fill in code here
}
new_f <- partial(f, a=1, c= 2)
Run Code Online (Sandbox Code Playgroud)

new_f将是一个功能bd和将返回1+b+2+d

在python我会这样做

from functools import partial

def f(a,b,c,d):
    return a+b+c+d

new_f = partial(f, a=1, c= 2)
Run Code Online (Sandbox Code Playgroud)

我实际上反复这样做,所以我需要尽可能高效.谁能指出我最有效的方法呢?现在我能做的最好的就是

partial <- function(f, ...){
    z <- list(...)
    formals(f) [names(z)] <- z
    f
}
Run Code Online (Sandbox Code Playgroud)

任何人都可以告诉我更快的方式或最好的方法吗?这太慢了.

r function partial-application

24
推荐指数
3
解决办法
3208
查看次数

ggplot2错误:scale_x_date显示/不删除指定限制之外的数据

我有一个问题,ggplot2即显示超出规模中指定限制的数据.见下面的例子.如果限制设置为这些值,为什么我在图表中显示2009/01/01之前和2015/01/01之后的点?

library(ggplot2)
library(scales)
set.seed(100)
z <- seq.Date(as.Date("2008/12/1"), as.Date("2015/12/14"), "day")
l <- expand.grid(z, c("a", "b", "c"))
w <- data.frame(x= l[, 1], t = l[, 2])
w$val <- runif(nrow(w))
ggplot(data=w, aes_string(x="x", y="val"))+scale_x_date(
  labels = date_format("%m/%d/%Y"),
  limits= c(as.Date("2009/1/1"), as.Date("2015/1/1")),
  breaks = "1 year")+
  geom_point(aes(color = t))
Run Code Online (Sandbox Code Playgroud)

是否仍然可以按指定的方式保留中断/缩放,但只使用ggplot /删除数据超出限制而不预先过滤数据?这对我来说似乎是个错误.文档声明限制过滤器数据.

结果情节

r ggplot2

9
推荐指数
1
解决办法
250
查看次数

stargazer将data.frame数据解释为乳胶代码是否构成错误或是这个意图?

我遇到的问题是Stargazer函数将data.frame中的数据解释为latex命令.我想找到一种方法来抑制观星者的这个特征.见下文.

z <- c("Bank of America Corp",
    "Citigroup Inc",
    "JPMorgan Chase & Co",
      "Morgan Stanley",
     "Wells Fargo & Co")

 s <- data.frame(z=z, l= c(100000, 25, 10000, 24, 100000))
 library(stargazer)
 stargazer(s, type = "text", summary = FALSE)
 # prints out
     ==============================
               z              l   
     ------------------------------
      1 Bank of America Corp 100,000
      2    Citigroup Inc       25   
      3    JPMorgan Chase      Co   
      4    Morgan Stanley      24   
      5     Wells Fargo        Co   
     ------------------------------
Run Code Online (Sandbox Code Playgroud)

由于其在乳胶中的含义,这里的&符导致新的列被假定.我确认了这一点,因为更换和使用并使桌子正确打印出来.

  z <- c("Bank of America Corp",
    "Citigroup Inc",
    "JPMorgan Chase and Co",
      "Morgan …
Run Code Online (Sandbox Code Playgroud)

r stargazer

6
推荐指数
1
解决办法
642
查看次数

使用Data.Table包按组拟合模型

如何使用data.table语法按组安装多个模型?我希望我的输出是一个data.frame,每个"按组"列有一列,每个模型适合一列.目前我可以使用dplyr包执行此操作,但不能在data.table中执行此操作.

# example data frame
df <- data.table(
   id = sample(c("id01", "id02", "id03"), N, TRUE),     
   v1 = sample(5, N, TRUE),                          
   v2 = sample(round(runif(100, max = 100), 4), N, TRUE) 
)

# equivalent code in dplyr
group_by(df, id) %>%
do( model1= lm(v1 ~v2, .),
    model2= lm(v2 ~v1, .)
  )

# attempt in data.table
df[, .(model1 = lm(v1~v2, .SD), model2 = lm(v2~v1, .SD) ), by = id ]

# Brodie G's solution
df[, .(model1 = list(lm(v1~v2, .SD)), model2 = list(lm(v2~v1, .SD))), by …
Run Code Online (Sandbox Code Playgroud)

r data.table

5
推荐指数
1
解决办法
1481
查看次数

使用功能列表和要传递的功能参数列表创建新功能

我试图从函数列表和要传递给这些函数的参数列表创建新函数,但到目前为止我无法这样做.请参阅下面的示例.

fun_list <- list(f = function(x, params) {x+params[1]}, 
          z = function(a, params) {a * params[1] * params[2]})
params_list <- list(f = 1, z = c(3, 5))

# goal is to create 2 new functions in global environment
#  fnew <- function(x) {x+1}
#  znew <- function(a) {a*3*5}

# I've tried
for(x in names(fun_list)){
  force(x)
  assign(paste0(x, "new"), function(...) fun_list[[x]] (...,  params = params_list[[x]]))
}
Run Code Online (Sandbox Code Playgroud)

目标是动态地为任意函数和参数执行此操作.

r

4
推荐指数
1
解决办法
133
查看次数