将自定义功能应用于R中的多个组

时间:2019-01-25 19:11:43

标签: r

我正在尝试将自定义函数应用于数据集的所有组。

我尝试将以下自定义函数应用于所有组,但是将其应用于整个数据集。但是,如果我将数据分为多个组并将每个组应用于此功能,则效果很好。

1 个答案:

答案 0 :(得分:2)

您几乎拥有了它。您只需要为每个组应用功能。 purrr库使此操作非常容易。

库:

library(purrr)
library(dplyr)

主要功能:

将组名和完整数据集作为参数,然后按该组进行过滤。然后进行计算并将其作为数据框返回。

width <- function(Group.Name, data){
  # limit to rows for that group
  df<-data %>% filter(Group == Group.Name)

  i.mins  <- which(diff(sign(diff(c(Inf, df$Value, Inf)))) == 2)

  i.mx <- which.max(df$Value)

  i <- sort(c(i.mins, i.mx))

  ix <- i[which(i == i.mx) + c(-1, 1)]

  # put results in dataframe
  df <- data.frame("Group" = Group.Name, "Value_1" = ix[1], "Value_2" = ix[2])

  # format Group Col
  df$Group <- as.character(df$Group)
  return(df)
}

通过purrr遍历群组

# unique group names we need to loop through for calcs
Group.Names <- unique(data$Group)

# take each name and use the width function
# then put results together in one datframe
Group.Names %>% map_df(~ width(Group.Name = .x, data = data))

结果:

   Group Value_1 Value_2
1 Group1      16      22
2 Group2       4      12
3 Group3       2      15

注意:.x符号只是告诉map将Group.Names对象作为宽度函数的第一个参数