每当我想在R中做一些"map"py时,我通常会尝试使用一个函数 apply家族中.
但是,我从来没有完全理解它们之间的区别 - 如何{ sapply,lapply等}将函数应用于输入/分组输入,输出将是什么样的,甚至输入可以是什么 - 所以我经常只要仔细检查它们,直到我得到我想要的东西.
有人可以解释如何使用哪一个?
我当前(可能不正确/不完整)的理解是......
sapply(vec, f):输入是一个向量.output是一个向量/矩阵,其中element i是f(vec[i])一个矩阵,如果f有一个多元素输出
lapply(vec, f):相同sapply,但输出是一个列表?
apply(matrix, 1/2, f):输入是一个矩阵.output是一个向量,其中element i是f(矩阵的row/col i)tapply(vector, grouping, f):output是一个矩阵/数组,其中矩阵/数组中的元素是向量f分组g的值,和g被推送到行/列名称by(dataframe, grouping, f):让我们g成为一个分组.适用f于组/数据框的每一列.漂亮打印分组和f每列的值.aggregate(matrix, grouping, f):类似于by,但不是将输出打印得很漂亮,而是将所有内容都粘贴到数据帧中.侧问题:我还没有学会plyr或重塑-将plyr或reshape更换所有这些完全?
我最近遇到了python 的pandas库,根据这个基准测试执行非常快速的内存中合并.它甚至比R中的data.table包更快(我选择用于分析的语言).
为什么pandas这么快data.table?是因为python具有超过R的固有速度优势,还是有一些我不知道的权衡?有没有办法在data.table不诉诸merge(X, Y, all=FALSE)和执行内部和外部联接的情况下merge(X, Y, all=TRUE)?

我有以下数据框架
x <- read.table(text = " id1 id2 val1 val2
1 a x 1 9
2 a x 2 4
3 a y 3 5
4 a y 4 9
5 b x 1 7
6 b y 4 4
7 b x 3 9
8 b y 2 8", header = TRUE)
Run Code Online (Sandbox Code Playgroud)
我想计算按id1和id2分组的val1和val2的平均值,并同时计算每个id1-id2组合的行数.我可以单独执行每个计算:
# calculate mean
aggregate(. ~ id1 + id2, data = x, FUN = mean)
# count rows
aggregate(. ~ id1 + id2, data = x, FUN …Run Code Online (Sandbox Code Playgroud) 我有一个类似于这个的大型数据框:
df <- data.frame(dive=factor(sample(c("dive1","dive2"),10,replace=TRUE)),speed=runif(10))
> df
dive speed
1 dive1 0.80668490
2 dive1 0.53349584
3 dive2 0.07571784
4 dive2 0.39518628
5 dive1 0.84557955
6 dive1 0.69121443
7 dive1 0.38124950
8 dive2 0.22536126
9 dive1 0.04704750
10 dive2 0.93561651
Run Code Online (Sandbox Code Playgroud)
我的目标是在另一列等于某个值时平均一列的值,并对所有值重复此值.即在上面的示例中,我想为列speed的每个唯一值返回列的平均值dive.所以当时dive==dive1,平均值speed是这个,依此类推dive.
正如标题所说.为什么润滑剂的功能要慢得多?
library(lubridate)
library(microbenchmark)
Dates <- sample(c(dates = format(seq(ISOdate(2010,1,1), by='day', length=365), format='%d-%m-%Y')), 50000, replace = TRUE)
microbenchmark(as.POSIXct(Dates, format = "%d-%b-%Y %H:%M:%S", tz = "GMT"), times = 100)
microbenchmark(dmy(Dates, tz ="GMT"), times = 100)
Unit: milliseconds
expr min lq median uq max
1 as.POSIXct(Dates, format = "%d-%b-%Y %H:%M:%S", tz = "GMT") 103.1902 104.3247 108.675 109.2632 149.871
2 dmy(Dates, tz = "GMT") 184.4871 194.1504 197.8422 214.3771 268.4911
Run Code Online (Sandbox Code Playgroud) 像大多数人一样,Hadley Wickham和他所做的事情给我留下了深刻的印象R- 所以我想我会把一些功能转移到他tidyverse身上......这样做我不知道这一切的意义是什么?
我的新dplyr功能比它们的基本等效速度慢得多 - 我希望我做错了什么.我特别喜欢从理解所需的努力中得到一些回报non-standard-evaluation.
那么,我做错了什么?为什么dplyr这么慢?
一个例子:
require(microbenchmark)
require(dplyr)
df <- tibble(
a = 1:10,
b = c(1:5, 4:0),
c = 10:1)
addSpread_base <- function() {
df[['spread']] <- df[['a']] - df[['b']]
df
}
addSpread_dplyr <- function() df %>% mutate(spread := a - b)
all.equal(addSpread_base(), addSpread_dplyr())
microbenchmark(addSpread_base(), addSpread_dplyr(), times = 1e4)
Run Code Online (Sandbox Code Playgroud)
时间结果:
Unit: microseconds
expr min lq mean median uq max neval
addSpread_base() 12.058 15.769 22.07805 24.58 26.435 …Run Code Online (Sandbox Code Playgroud) 我有一个长数据框,其中包含来自桅杆的气象数据.它包含在不同高度()data$value的不同参数(风速,方向,气温等data$param)的同时拍摄的观测值(data$z)
我试图有效地切片这些数据$time,然后将函数应用于收集的所有数据.通常,功能一次应用于单个$param(即,我对风速应用不同的函数而不是空气温度).
我目前的方法是使用data.frame和ddply.
如果我想获得所有风速数据,我运行:
# find good data ----
df <- data[((data$param == "wind speed") &
!is.na(data$value)),]
Run Code Online (Sandbox Code Playgroud)
然后我运行我的函数df使用ddply():
df.tav <- ddply(df,
.(time),
function(x) {
y <-data.frame(V1 = sum(x$value) + sum(x$z),
V2 = sum(x$value) / sum(x$z))
return(y)
})
Run Code Online (Sandbox Code Playgroud)
通常V1和V2是对其他功能的调用.这些只是一些例子.我确实需要在相同的数据上运行多个函数.
我目前的方法很慢.我没有对它进行基准测试,但它足够慢,我可以去喝咖啡,然后在一年的数据处理之前回来.
我有订单(百)塔要处理,每个都有一年的数据和10-12个高度,所以我正在寻找更快的东西.
data <- structure(list(time = structure(c(1262304600, 1262304600, 1262304600,
1262304600, 1262304600, 1262304600, 1262304600, 1262304600, 1262304600,
1262304600, 1262304600, 1262304600, 1262304600, …Run Code Online (Sandbox Code Playgroud) 我有一个表示每小时温度数据的数组,并希望计算每日最大值(或最小值,或均值).我可以使用for循环来做到这一点,但我相信在R中必须有更好的方法来做到这一点.
require(ncdf4)
nc <- nc_open('file.nc')
t2 <- ncvar_get(nc,var='T2') # [ncols, nrows, nsteps]
Run Code Online (Sandbox Code Playgroud)
现在t2是一个阵列,每天有3144个小时的时间步长.我想要的是:
t2.max[ncols, nrows, 31]
Run Code Online (Sandbox Code Playgroud)
或者,更一般地说,我想重塑t2:
t2.reshape[ncols, nrows, ndays, 24]
Run Code Online (Sandbox Code Playgroud)
从那里我可以使用apply来计算每日平均值或最大值或其他.
我希望结果是一个数组,而不是数据框.
建议?我尝试使用reshape包中的melt/cast,但无法理解如何指定所需的公式.
继我的问题之后:
1.确定一组变量是否唯一地标识数据的每一行;
2. 根据给定的变量集标记所有重复的行,
我现在想通过获取它们的总和,根据给定的变量集合来汇总/合并所有重复的行.
关于如何在这里执行此操作有一些指导,但是当存在构成索引的大量变量级别时,ddply推荐的方法很慢,因为在我尝试标记所有重复项的情况下通过一组给定的变量.
# Values of (f1, f2, f3, f4) uniquely identify observations
dfUnique = expand.grid(f1 = factor(1:16),
f2 = factor(1:41),
f3 = factor(1:2),
f4 = factor(1:104))
# sample some extra rows and rbind them
dfDup = rbind(dfUnique, dfUnique[sample(1:nrow(dfUnique), 100), ])
# dummy data
dfDup$data = rnorm(nrow(dfDup))
# aggregate the duplicate rows by taking the sum
dfDupAgg = ddply(dfDup, .(f1, f2, f3, f4), summarise, data = sum(data))
Run Code Online (Sandbox Code Playgroud)
第二个解决方案是使用data.table,并遵循 …