【问题标题】:R: How do I avoid getting an error when merging two data frames (group by/summarise)?R:合并两个数据帧(分组/汇总)时如何避免出错?
【发布时间】:2020-09-30 04:31:58
【问题描述】:

我有一个很大的data frame 80,000 行。它是由不同年份的个人data frames 组合而成的。 origin 变量表示条目的原始data frame 的年份。

这是data frame 大行中前几行的示例,显示了 2003 年和 2011 年的数据帧是如何组合的。

df_1:
ID City State origin
1  NY   NY    2003 
2  NY   NY    2003
3  SF   CA    2003
1  NY   NY    2011
3  SF   CA    2011
2  NY   NY    2011
4  LA   CA    2011
5  SD   CA    2011

现在我想创建一个名为first_appearance 的新变量,它为每个ID 获取origin 变量中的min

final_df:
ID City State     origin   first_appearance
    1  NY   NY    2003     2003
    2  NY   NY    2003     2003
    3  SF   CA    2003     2003
    1  NY   NY    2011     2003
    3  SF   CA    2011     2003
    2  NY   NY    2011     2003
    4  LA   CA    2011     2011
    5  SD   CA    2011     2011

到目前为止,我已经尝试过使用:

prestep_final <- df_1 %>% group_by(ID) %>% summarise(first_apperance = min(origin))
final_df <- merge(prestep_final, df_1, by = "ID")

Prestep_final 工作并生成带有IDfirst_appearancedata frame

很遗憾,merge 步骤不起作用,并产生一个仅包含 NA 条目的 data frame

如何改进我的代码,以便生成类似于上面final_df 的表格。如有任何建议,我将不胜感激,并且没有包裹偏好。

【问题讨论】:

    标签: r group-by merge summarize


    【解决方案1】:

    如果您将summarise 更改为mutate,则无需合并即可获得所需的结果:

    library(tidyverse)
    
    df <- tibble::tribble(
      ~ID, ~City, ~State, ~origin,
        1,  'NY',   'NY',    2003, 
        2,  'NY',   'NY',    2003,
        3,  'SF',   'CA',    2003,
        1,  'NY',   'NY',    2011,
        3,  'SF',   'CA',    2011,
        2,  'NY',   'NY',    2011,
        4,  'LA',   'CA',    2011,
        5,  'SD',   'CA',    2011
    )
    
    df %>% group_by(ID) %>% 
      mutate(first_appearance = min(origin))
    #> # A tibble: 8 x 5
    #> # Groups:   ID [5]
    #>      ID City  State origin first_appearance
    #>   <dbl> <chr> <chr>  <dbl>            <dbl>
    #> 1     1 NY    NY      2003             2003
    #> 2     2 NY    NY      2003             2003
    #> 3     3 SF    CA      2003             2003
    #> 4     1 NY    NY      2011             2003
    #> 5     3 SF    CA      2011             2003
    #> 6     2 NY    NY      2011             2003
    #> 7     4 LA    CA      2011             2011
    #> 8     5 SD    CA      2011             2011
    

    reprex package (v0.3.0) 于 2020-06-10 创建

    【讨论】:

    • 谢谢你,@MarBio!
    【解决方案2】:

    data.table 的选项

    library(data.table)
    setDT(df)[, first_appearance := min(origin), ID]
    

    或在base R

    df$first_appearance <- with(df, ave(origin, ID, FUN = min))
    

    【讨论】:

    • 这是一个非常巧妙的解决方案。谢谢@akrun!
    猜你喜欢
    • 1970-01-01
    • 2019-03-29
    • 2014-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多