【问题标题】:How to a run function per group that return vector, not single value?如何为每组运行返回向量而不是单个值的函数?
【发布时间】:2017-04-18 13:24:13
【问题描述】:

我有一个数据集data.frame(x=rnorm(100),group=c(rep('a',40),rep('b',60))),我想用 dplyr 对每个组进行分析。例如我想使用fft。如何在每个组上运行一个函数,该函数返回一个序列,而不仅仅是值。如果它只是一个我可以总结的值,那么在这里不起作用。我希望像data.frame(y=c(21,62,83,4,35,46,17,28), group=c(rep('a',5),rep('b',3))) 这样的输出。如果可能的话,我想用 dplyr 来做,因为我认为它提高了可读性。

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    在使用summarise 创建list 输出后,我们可以使用unnest。使用起来会更容易

    library(tidyverse)
    df1 %>%
        group_by(group) %>%
        summarise(value = list(fft(x))) %>%
        unnest()
    

    【讨论】:

    • 啊,奖金第四个选项。对于一维输出数据(如 FFT),我可能更喜欢这个。
    【解决方案2】:

    基本上有三种选择:

    1. 如果您想为每个组创建一个汇总值,请使用summarize
    2. 如果要转换每个组的每个值,请使用mutate
    3. 如果要为每个组创建一个新表,请使用do

    如果我理解正确的话,最后一个选项似乎最符合您的目的。 do 通常是这些选项中最强大的,但也是最难使用的。一般语法是:

    data %>%
        group_by(grouping_cols) %>%
        do(data_frame(col1 = some_transformation(.$x)))
    

    例如:

    iris %>%
        group_by(Species) %>%
        do(broom::tidy(lm(Sepal.Length ~ Sepal.Width, data = .)))
    

    【讨论】:

    • 谢谢。我收集了这么多。能举个例子怎么用do吗?
    • 谢谢!现在非常有帮助。抱歉,我只能检查一个答案。
    • @Make42 正如我对另一个答案的评论,我认为它实际上是解决您问题的更好方法。
    猜你喜欢
    • 2015-11-27
    • 2017-07-16
    • 2021-06-12
    • 1970-01-01
    • 2014-06-27
    • 1970-01-01
    • 2021-10-17
    • 2020-08-22
    • 1970-01-01
    相关资源
    最近更新 更多