标签: mapply

R data.table将函数应用于使用列作为参数的行

我有以下内容 data.table

x = structure(list(f1 = 1:3, f2 = 3:5), .Names = c("f1", "f2"), row.names = c(NA, -3L), class = c("data.table", "data.frame"))
Run Code Online (Sandbox Code Playgroud)

我想将一个函数应用于每一行data.table.该函数func.test使用args f1并对其f2执行某些操作并返回计算值.假设(作为例子)

func.text <- function(arg1,arg2){ return(arg1 + exp(arg2))}
Run Code Online (Sandbox Code Playgroud)

但我的真实函数更复杂,并且循环和所有,但返回计算值.实现这一目标的最佳方法是什么?

r mapply data.table

26
推荐指数
3
解决办法
3万
查看次数

将函数应用于两个列表?

为了找到两个矩阵X和Y的行方向相关性,输出应该具有X的行1和Y的行1的相关值,...因此总共十个值(因为有十行):

X <- matrix(rnorm(2000), nrow=10)
Y <- matrix(rnorm(2000), nrow=10)

sapply(1:10, function(row) cor(X[row,], Y[row,]))
Run Code Online (Sandbox Code Playgroud)

现在,我应该如何将此函数应用于两个列表(每个包含大约50个数据帧)?

考虑列表A具有数据帧$ 1,$ 2,$ 3 ......等等,列表B具有相似数量的数据帧$ 1,$ 2,$ 3.因此,功能应适用于listA$1,listB$1listA$2,listB$2在列表中的其他dataframes ...等等.最后,我将在比较1(listA$1listB$1)和其他人的情况下有十个值.

这可以用"lapply"来完成吗?

r parameter-passing apply mapply

25
推荐指数
1
解决办法
2万
查看次数

强制mapply返回列表?

假设我有一个创建数据帧的函数.我想用不同的输入值运行该函数,然后将结果整合到一个大数据框中,如下所示:

CreateDataFrame <- function(type="A", n=10, n.true=8) {
  data.frame(success=c(rep(TRUE, n.true), rep(FALSE, n - n.true)), type=type)
}
df <- do.call(rbind, lapply(toupper(letters[1:5]), CreateDataFrame))
Run Code Online (Sandbox Code Playgroud)

我的CreateDataFrame函数有三个参数.在上面的示例中,第二个和第三个参数保持不变.我想像上面一样做,但每次调用都会改变第二个和第三个参数.我想我必须使用mapply,像这样:

mapply("CreateDataFrame", type=toupper(letters[1:5]), n=10, n.true=8:4)
Run Code Online (Sandbox Code Playgroud)

我遇到了麻烦,因为mapply没有返回列表,这阻止了我运行do.call(rbind, mapply(...)).我怎么能得到一个数据框,就像我在顶部的例子中所做的那样?

看起来mapply正在返回一个列表矩阵.我期待它返回一个数据框列表.我该怎么办?

r mapply

17
推荐指数
2
解决办法
4896
查看次数

自适应移动平均 - R中的最佳性能

我正在寻找R中滚动/滑动窗口函数方面的一些性能提升.这是一个非常常见的任务,可用于任何有序的观测数据集.我想分享一些我的发现,也许有人能够提供反馈,使其更快.
重要的是我专注于案例align="right"和自适应滚动窗口,因此width是一个向量(与我们的观察向量相同的长度).如果我们有width标量,那么已经有非常好的函数zooTTR包非常难以击败(4年后:它比我预期的要容易),因为其中一些甚至使用Fortran(但仍然是用户定义的)使用下面提到的FUN可以更快wapply.
RcppRoll由于其出色的性能,包值得值得一提,但到目前为止还没有能够回答这个问题的功能.如果有人可以扩展它以回答这个问题,那将会很棒.

考虑一下我们有以下数据:

x = c(120,105,118,140,142,141,135,152,154,138,125,132,131,120)
plot(x, type="l")
Run Code Online (Sandbox Code Playgroud)

大块make_x的情节

我们希望在x带有可变滚动窗口的矢量上应用滚动函数width.

set.seed(1)
width = sample(2:4,length(x),TRUE)
Run Code Online (Sandbox Code Playgroud)

在这种特殊情况下,我们将不得不滚动功能适应samplec(2,3,4).
我们将应用mean功能,预期结果:

r = f(x, width, FUN = mean)
print(r)
##  [1]       NA       NA 114.3333 120.7500 141.0000 135.2500 139.5000
##  [8] 142.6667 147.0000 146.0000 131.5000 128.5000 131.5000 127.6667
plot(x, type="l")
lines(r, col="red")
Run Code Online (Sandbox Code Playgroud)

大块make_results的情节

任何指标都可用于产生自width变量作为自适应移动平均线的不同变体或任何其他函数.

寻找最佳表现.

r zoo mapply rollapply data.table

16
推荐指数
3
解决办法
5555
查看次数

在所有参数组合上应用函数

我希望能够将函数应用于一组输入参数的所有组合.我有一个工作的解决方案(下面),但如果没有更好/更通用的方法来使用,例如plyr,但是到目前为止还没有找到任何东西,我会感到惊讶.有更好的解决方案吗?

# Apply function FUN to all combinations of arguments and append results to
# data frame of arguments
cmapply <- function(FUN, ..., MoreArgs = NULL, SIMPLIFY = TRUE, 
    USE.NAMES = TRUE)
{
    l <- expand.grid(..., stringsAsFactors=FALSE)
    r <- do.call(mapply, c(
        list(FUN=FUN, MoreArgs = MoreArgs, SIMPLIFY = SIMPLIFY, USE.NAMES = USE.NAMES), 
        l
    ))
    if (is.matrix(r)) r <- t(r) 
    cbind(l, r)
}
Run Code Online (Sandbox Code Playgroud)

例子:

# calculate sum of combinations of 1:3, 1:3 and 1:2
cmapply(arg1=1:3, arg2=1:3, 1:2, FUN=sum)

# paste input arguments …
Run Code Online (Sandbox Code Playgroud)

r mapply

16
推荐指数
1
解决办法
1743
查看次数

避免R中的多个for循环来计算矩阵

因此,在生成一些假数据来回答地图问题的过程中,我发现自己写了以下内容:

# Generate some fake data
lat <- seq(-90, 90, by = 5)
lon <- seq(-180, 180, by = 10)
phi <- matrix(0, nrow = length(lat), ncol = length(lon))
i <- 1
for (l1 in lat) {
    j <- 1
    for (l2 in lon) {
        phi[i, j] <- (sin(pi * l1 / 180) * cos(pi * l2 / 180))^2
        j <- j+1
    }
    i <- i+1
}
phi <- 1500*phi + 4500  # scale it properly
Run Code Online (Sandbox Code Playgroud)

现在显然这两个中心for循环并不像我想的那样R'ish.看起来我应该能够得到一个mapply或者什么来做这项工作,但遗憾的是,它返回一个列表,并没有真正做我想要的.其他适用似乎也没有做正确的事情.

我在这里错过了什么?

for-loop r matrix mapply

15
推荐指数
4
解决办法
798
查看次数

Vectorize()vs apply()

Vectorize()apply()功能R往往可以用来完成相同的目标.出于可读性的原因,我通常更喜欢向量化函数,因为主调用函数与手头的任务有关,而sapply不是.Vectorize()当我在R代码中多次使用该向量化函数时,它也很有用.例如:

a <- 100
b <- 200
c <- 300
varnames <- c('a', 'b', 'c')

getv <- Vectorize(get)
getv(varnames)
Run Code Online (Sandbox Code Playgroud)

VS

sapply(varnames, get)
Run Code Online (Sandbox Code Playgroud)

但是,至少在SO上我很少看到Vectorize()解决方案中的例子,只有apply()(或其中一个兄弟姐妹).是否有任何效率问题或其他合理问题Vectorize()可以做出apply()更好的选择?

r vectorization apply mapply

12
推荐指数
2
解决办法
3582
查看次数

在 R 中使用 mapply 对子集参数的非标准评估

我不能使用subset的参数xtabsaggregate(或I测试,包括任何功能ftablelm)用mapply。以下调用因subset参数而失败,但它们可以在没有的情况下工作:

mapply(FUN = xtabs,
       formula = list(~ wool,
                      ~ wool + tension),
       subset = list(breaks < 15,
                     breaks < 20),
       MoreArgs = list(data = warpbreaks))

# Error in mapply(FUN = xtabs, formula = list(~wool, ~wool + tension), subset = list(breaks <  : 
#   object 'breaks' not found
# 
# expected result 1/2:
# wool
# A B 
# 2 2
# 
# expected result 2/2:
# …
Run Code Online (Sandbox Code Playgroud)

evaluation scope r subset mapply

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

R data.table列名在函数内不起作用

我试图在函数中使用data.table,我试图理解为什么我的代码失败.我有一个data.table如下:

DT <- data.table(my_name=c("A","B","C","D","E","F"),my_id=c(2,2,3,3,4,4))
> DT
   my_name my_id
1:       A     2
2:       B     2
3:       C     3
4:       D     3
5:       E     4
6:       F     4
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用不同的"my_id"值创建所有"my_name"对,对于DT,它将是:

Var1 Var2    
A    C
A    D
A    E
A    F
B    C
B    D
B    E
B    F
C    E
C    F
D    E
D    F
Run Code Online (Sandbox Code Playgroud)

我有一个函数来返回"my_id"的所有对"my_name",这对值"my_id"按预期工作.

get_pairs <- function(id1,id2,tdt) {
    return(expand.grid(tdt[my_id==id1,my_name],tdt[my_id==id2,my_name]))
}
> get_pairs(2,3,DT)
Var1 Var2
1    A    C
2    B    C
3    A    D
4    B    D
Run Code Online (Sandbox Code Playgroud)

现在,我想对所有id对执行此函数,我尝试通过查找所有id对然后使用mapply和get_pairs函数来执行此操作.

> combn(unique(DT$my_id),2)
     [,1] …
Run Code Online (Sandbox Code Playgroud)

r mapply data.table

8
推荐指数
1
解决办法
1302
查看次数

quantmod :: chart_Series和mapply给出图表参数错误

如何在chart_Series中正确使用MoreArgs?

p.txt

s,n
ABBV,AbbVie
BMY,Bristol
LLY,EliLily
MRK,Merck
PFE,Pfizer
Run Code Online (Sandbox Code Playgroud)

苏菲

# R --silent --vanilla < sof.r
library(quantmod)
options("getSymbols.warning4.0"=FALSE)
options("getSymbols.yahoo.warning"=FALSE)

# setup chart params
cp <- chart_pars()
cp$cex=0.55
cp$mar=c(1,1,0,0) # B,L,T,R
# setup chart theme
ct <- chart_theme() 
ct$format.labels <- ' ' # AG: space needed to remove bottom x-axis labels
ct$lylab <- TRUE        # AG: enable left y-axis labels
ct$rylab <- FALSE       # AG: remove right y-axis labels
ct$grid.ticks.lwd=1

# read values into vectors
csv <- read.csv("p.txt", stringsAsFactors = …
Run Code Online (Sandbox Code Playgroud)

r candlestick-chart quantmod mapply

7
推荐指数
1
解决办法
65
查看次数