Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 将函数应用于按分组的数据帧_R_Data.table_Dplyr_Apply - Fatal编程技术网

R 将函数应用于按分组的数据帧

R 将函数应用于按分组的数据帧,r,data.table,dplyr,apply,R,Data.table,Dplyr,Apply,我想将一个函数应用于数据帧的子集,这些数据帧是在通过一些变量分组后从初始数据帧生成的。因此,我正在寻找一个等价的包装器,如apply或类似的包装器,将整个数据帧作为输入,并输出一个向量。这是因为手头的函数需要来自不同位置的行和列的条目,并且不能简化为仅使用行和列,因此其形式为lappy或apply(df,1(2),…) 让我们考虑下面的例子: iris <- data.table(iris) my.function <- function(sub.data){ v <-

我想将一个函数应用于数据帧的子集,这些数据帧是在通过一些变量分组后从初始数据帧生成的。因此,我正在寻找一个等价的包装器,如
apply
或类似的包装器,将整个数据帧作为输入,并输出一个向量。这是因为手头的函数需要来自不同位置的行和列的条目,并且不能简化为仅使用行和列,因此其形式为
lappy
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)
}
其中,
wrapper
是我正在寻找的环境,类型为
lappy
或类似。同样,也可以使用包
dplyr
,但我不知道相应的语法是什么:我已经尝试过了

results <- iris %>%
                group_by(Species) %>%
                     summarise(results = my.function(iris))
结果%
组别(种类)%>%
总结(结果=我的功能(iris))

但这似乎不能产生正确的结果,因为它针对每个物种的整个数据集运行,而不是分成子集。

这里似乎不需要
包装器。只需在.SD上运行函数即可满足您的需要

library(data.table)
#your function works with a data.table
#by below will create smaller data tables on which you can directly
#run my.function on
iris[, my.function(.SD), by=Species]
输出:

       Species     V1
  1:    setosa     NA
  2:    setosa not ok
  3:    setosa not ok
  4:    setosa not ok
  5:    setosa not ok
 ---                 
146: virginica     ok
147: virginica     ok
148: virginica     ok
149: virginica     ok
150: virginica     ok

这里似乎不需要
包装器。只需在.SD上运行函数即可满足您的需要

library(data.table)
#your function works with a data.table
#by below will create smaller data tables on which you can directly
#run my.function on
iris[, my.function(.SD), by=Species]
输出:

       Species     V1
  1:    setosa     NA
  2:    setosa not ok
  3:    setosa not ok
  4:    setosa not ok
  5:    setosa not ok
 ---                 
146: virginica     ok
147: virginica     ok
148: virginica     ok
149: virginica     ok
150: virginica     ok

这里的目标是不使用软件包吗

输出向量的长度是否与data.frame的行数相同?如果是这样,请尝试
ave
,其中我们使用了一个测试
my.function
,它返回的行数乘以输入数据帧的列数:

my.function <- function(x) prod(dim(x)) # test function
ave(1:nrow(iris), iris$Species, FUN = function(ix) my.function(iris[ix, ]))
##  [1] 250 250 250 250 250 250 250 250 ...
或通过

c(by(iris, iris$Species, my.function))
## setosa versicolor  virginica 
##    250        250        250 
sapply/split

sapply(split(iris, iris$Species), my.function)
## setosa versicolor  virginica 
##    250        250        250 

这里的目标是不使用软件包吗

输出向量的长度是否与data.frame的行数相同?如果是这样,请尝试
ave
,其中我们使用了一个测试
my.function
,它返回的行数乘以输入数据帧的列数:

my.function <- function(x) prod(dim(x)) # test function
ave(1:nrow(iris), iris$Species, FUN = function(ix) my.function(iris[ix, ]))
##  [1] 250 250 250 250 250 250 250 250 ...
或通过

c(by(iris, iris$Species, my.function))
## setosa versicolor  virginica 
##    250        250        250 
sapply/split

sapply(split(iris, iris$Species), my.function)
## setosa versicolor  virginica 
##    250        250        250 

你想从软件包
plyr
中得到类似
ddply()
的东西吗?
摘要(results=my.function(.)
?@rawr人们通常在回答时不检查注释。请考虑把它作为一个答案。@ RAWR是的,这样做了。同样对于
ddply
,谢谢!你想从软件包
plyr
中得到类似
ddply()
的东西吗?
摘要(results=my.function(.)
?@rawr人们通常在回答时不检查注释。请考虑把它作为一个答案。@ RAWR是的,这样做了。同样对于
ddply
,谢谢!