提问者:小点点

归一化函数应用于具有分组行的所有列


以虹膜数据为例,有三种类型的虹膜:刚毛虹膜、花色虹膜和维吉尼亚虹膜。我想使它们的萼片正常化。长度分别为。我知道一个简单但乏味的过程。是否有更简单的方法来实现我的目标?我的过程:

    data(iris)
    library(dplyr)
    normalize <- function(x){
        return((x- mean(x))/(max(x)-min(x)))
    }
    data1 <- sapply(filter(iris, Species == 'setosa')[1:4], normalize)
    data2 <- sapply(filter(iris, Species == 'versicolor')[1:4], normalize)
    data3 <- sapply(filter(iris, Species == 'virginica')[1:4], normalize)
    Speiec <- rep(c('setosa','versicolor','virginica'), each = 50)
    thedata <- rbind(data1, data2,data3)
    theirisdata <- data.frame(thedata,Speiec)

最后的数据“theirisdata”具有相同的数据结构,但是萼片。萼片长。花瓣的宽度。长度和花瓣。每个物种组的宽度均标准化。我需要一个更简洁的方法来处理这样的问题。例如,数据帧的行可以分为10个或更多组。对于每个组,每个列都应用了一个函数。


共1个答案

匿名用户

您可以在dplyr中使用groupby将函数分别应用于每个组,然后使用mutate\u each

data(iris)
library(dplyr)
normalize <- function(x){
    return((x- mean(x))/(max(x)-min(x)))
}

my_data <- iris %>% group_by(Species) %>% 
    mutate_each(funs(normalize))

检查其返回的结果是否与原始答案相同:

all(my_data == theirisdata)
 [1] TRUE