假设我有一个A至少有一个"Type"列的数据集和一个"Data"包含T个不同观察类型的列,对于每个我将应用不同的函数:
funlist <- c(fun1, fun2,..., funT)
Run Code Online (Sandbox Code Playgroud)
我可以通过以下方式完成此任务:
方法1: sapply
for(t in 1:T){
sapply(A[A[,"Type"]==t,"Data"],funlist[[t]])
}
Run Code Online (Sandbox Code Playgroud)
方法2: mapply
funvector <- rep(NaN,length(A[,"Type"]))
for(t in 1:T){
funvector[A[,"Type"]]==t] <- funlist[[t]]
}
mapply(function(fun, x) fun(x), funvector, A[,"Data"])
Run Code Online (Sandbox Code Playgroud)
方法2是特别不合需要的,因为它创建了一个额外的对象,但在任何一种方法中我都无法避免创建for循环.由于我正在使用如此大的数据集以至于存储器约束是一个问题,是否有更有效的方法来编码这个问题,以便尽可能减少内存使用,即使以合理的速度成本?
其他几个选择:
A <- data.frame(Type=c(1,1,2,2), Data=c(0.5,1,100,101))
funlist <- list(exp, log)
by(A, A$Type, FUN=function(DF) funlist[[DF$Type[1]]](DF$Data) )
#A$Type: 1
#[1] 1.648721 2.718282
#-----------------------------------------
#A$Type: 2
#[1] 4.605170 4.615121
Run Code Online (Sandbox Code Playgroud)
library(dplyr)
A %>%
group_by(Type) %>%
mutate(Data=funlist[[Type[1]]](Data))
Source: local data frame [4 x 2]
Groups: Type
# Type Data
#1 1 1.648721
#2 1 2.718282
#3 2 4.605170
#4 2 4.615121
Run Code Online (Sandbox Code Playgroud)
library(data.table)
setDT(A)
A[, .(Data=funlist[[unlist(.BY)]](Data)), by=Type]
# Type Data
#1: 1 1.648721
#2: 1 2.718282
#3: 2 4.605170
#4: 2 4.615121
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
97 次 |
| 最近记录: |