【发布时间】:2015-11-12 15:45:03
【问题描述】:
我想将一个函数应用于数据帧的子集,这些子集在按一些变量分组后源自初始子集。因此,我正在寻找一个与apply 或类似的等效包装器,将整个数据帧作为输入并输出一个向量。这是因为手头的函数需要来自不同地方的行和列的条目,不能简化为只使用行和列,因此形式为lapply或apply(df, 1(2),...)
让我们考虑下面的例子:
iris <- data.table(iris)
my.function <- function(sub.data){
v <- c(NA)
for(j in 2:dim(sub.data)[1]){
if(sub.data[j,1, with = FALSE] > sub.data[j-1,2, with = FALSE]+2){
v[j] <- "ok"
} else {
v[j] <- "not ok"
}
}
return(v)
}
执行my.function(iris) 工作正常,但假设我只想将该功能应用于具有相同物种的组。因此,在 data.table 语法中,应该如下所示:
results <- iris[,
wrapper(.SD, my.function),
by = Species
]
wrapper 是我正在寻找的环境,类型为 lapply 或类似。等效地,也可以使用包dplyr,但我不知道对应的语法是什么:我试过了
results <- iris %>%
group_by(Species) %>%
summarise(results = my.function(iris))
但这似乎不会产生正确的结果,因为它仍然针对每个物种的整个数据集运行,而不是分成子集。
【问题讨论】:
-
你想从包
plyr中得到类似ddply()的东西吗? -
summarise(results = my.function(.))? -
@rawr 人们通常不会在回答时检查 cmets。请考虑将其发布为答案。
-
@rawr 是的,这就是工作。同样对于
ddply,谢谢!
标签: r data.table dplyr apply