我有以下内容 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)
但我的真实函数更复杂,并且循环和所有,但返回计算值.实现这一目标的最佳方法是什么?
为了找到两个矩阵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$1并listA$2,listB$2在列表中的其他dataframes ...等等.最后,我将在比较1(listA$1和listB$1)和其他人的情况下有十个值.
这可以用"lapply"来完成吗?
假设我有一个创建数据帧的函数.我想用不同的输入值运行该函数,然后将结果整合到一个大数据框中,如下所示:
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中滚动/滑动窗口函数方面的一些性能提升.这是一个非常常见的任务,可用于任何有序的观测数据集.我想分享一些我的发现,也许有人能够提供反馈,使其更快.
重要的是我专注于案例align="right"和自适应滚动窗口,因此width是一个向量(与我们的观察向量相同的长度).如果我们有width标量,那么已经有非常好的函数zoo和TTR包非常难以击败(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)

我们希望在x带有可变滚动窗口的矢量上应用滚动函数width.
set.seed(1)
width = sample(2:4,length(x),TRUE)
Run Code Online (Sandbox Code Playgroud)
在这种特殊情况下,我们将不得不滚动功能适应sample的c(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)

任何指标都可用于产生自width变量作为自适应移动平均线的不同变体或任何其他函数.
寻找最佳表现.
我希望能够将函数应用于一组输入参数的所有组合.我有一个工作的解决方案(下面),但如果没有更好/更通用的方法来使用,例如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) 因此,在生成一些假数据来回答地图问题的过程中,我发现自己写了以下内容:
# 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或者什么来做这项工作,但遗憾的是,它返回一个列表,并没有真正做我想要的.其他适用似乎也没有做正确的事情.
我在这里错过了什么?
该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()更好的选择?
我不能使用subset的参数xtabs或aggregate(或I测试,包括任何功能ftable和lm)用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) 我试图在函数中使用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) 如何在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)