相关疑难解决方法(0)

分组函数(tapply,by,aggregate)和*apply系列

每当我想在R中做一些"map"py时,我通常会尝试使用一个函数 apply家族中.

但是,我从来没有完全理解它们之间的区别 - 如何{ sapply,lapply等}将函数应用于输入/分组输入,输出将是什么样的,甚至输入可以是什么 - 所以我经常只要仔细检查它们,直到我得到我想要的东西.

有人可以解释如何使用哪一个?

我当前(可能不正确/不完整)的理解是......

  1. sapply(vec, f):输入是一个向量.output是一个向量/矩阵,其中element if(vec[i])一个矩阵,如果f有一个多元素输出

  2. lapply(vec, f):相同sapply,但输出是一个列表?

  3. apply(matrix, 1/2, f):输入是一个矩阵.output是一个向量,其中element i是f(矩阵的row/col i)
  4. tapply(vector, grouping, f):output是一个矩阵/数组,其中矩阵/数组中的元素是向量f分组g的值,和g被推送到行/列名称
  5. by(dataframe, grouping, f):让我们g成为一个分组.适用f于组/数据框的每一列.漂亮打印分组和f每列的值.
  6. aggregate(matrix, grouping, f):类似于by,但不是将输出打印得很漂亮,而是将所有内容都粘贴到数据帧中.

侧问题:我还没有学会plyr或重塑-将plyrreshape更换所有这些完全?

r lapply sapply r-faq tapply

1011
推荐指数
10
解决办法
39万
查看次数

为什么pandas在python中的合并速度比2012年R中的data.table合并更快?

我最近遇到了python 的pandas库,根据这个基准测试执行非常快速的内存中合并.它甚至比R中的data.table包更快(我选择用于分析的语言).

为什么pandas这么快data.table?是因为python具有超过R的固有速度优势,还是有一些我不知道的权衡?有没有办法在data.table不诉诸merge(X, Y, all=FALSE)和执行内部和外部联接的情况下merge(X, Y, all=TRUE)

对照

这是用于对各种包进行基准测试的R代码Python代码.

python join r pandas data.table

156
推荐指数
4
解决办法
2万
查看次数

在一次调用中按组对多个变量应用多个汇总函数

我有以下数据框架

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)

aggregate r

85
推荐指数
5
解决办法
9万
查看次数

按组计算平均值

我有一个类似于这个的大型数据框:

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.

r dataframe r-faq

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

与as.POSIXct相比,为什么lubridate函数如此慢?

正如标题所说.为什么润滑剂的功能要慢得多?

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)

r lubridate

22
推荐指数
2
解决办法
3217
查看次数

为什么dplyr这么慢?

像大多数人一样,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)

performance r dplyr

11
推荐指数
1
解决办法
636
查看次数

在R中的长data.frames上有效使用函数

我有一个长数据框,其中包含来自桅杆的气象数据.它包含在不同高度()data$value的不同参数(风速,方向,气温等data$param)的同时拍摄的观测值(data$z)

我试图有效地切片这些数据$time,然后将函数应用于收集的所有数据.通常,功能一次应用于单个$param(即,我对风速应用不同的函数而不是空气温度).

目前的做法

我目前的方法是使用data.frameddply.

如果我想获得所有风​​速数据,我运行:

# 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)

r

6
推荐指数
2
解决办法
549
查看次数

重塑多维数组

我有一个表示每小时温度数据的数组,并希望计算每日最大值(或最小值,或均值).我可以使用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,但无法理解如何指定所需的公式.

r multidimensional-array reshape

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

通过获取总和来聚合重复的行

继我的问题之后:
1.确定一组变量是否唯一地标识数据的每一行;
2. 根据给定的变量集标记所有重复的行,
我现在想通过获取它们的总和,根据给定的变量集合来汇总/合并所有重复的行.

解决方案1:

关于如何在这里执行此操作有一些指导,但是当存在构成索引的大量变量级别时,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)

解决方案2:

第二个解决方案是使用data.table,并遵循 …

r plyr data.table

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