【问题标题】:how to to create new variable based on first entry of another variable如何根据另一个变量的第一个条目创建新变量
【发布时间】:2019-12-16 11:02:25
【问题描述】:

我创建了df

  gvkey  year 
1  1004  1965    
2  1004  1966       
3  1004  1967      
4  1005  1950        
5  1005  1951      
...

gvkey = 公司 ID

我的数据框包含 1200 多个唯一的 gvkeys,year 的起始值不同。

我想在df 中创建一个名为ipo_date 的列,它等于特定gvkey 的year 列中的第一个条目。

  gvkey  year  ipo_date
1  1004  1965    1965
2  1004  1966    1965
3  1004  1967    1965
4  1005  1950    1950
5  1005  1951    1950
...

之后我想删除ipo_date 的所有重复行并删除year 列

  gvkey  ipo_date
1  1004   1965
2  1005   1950
...

非常感谢!!!

【问题讨论】:

    标签: r conditional-statements transform


    【解决方案1】:

    你可以选择每个gvkey的第一行

    library(dplyr)
    df %>%  group_by(gvkey) %>%  slice(1L) %>%  rename_at(2, ~"ipo_date")
    
    #  gvkey ipo_date
    #  <int>    <int>
    #1  1004     1965
    #2  1005     1950
    

    在data.table和base R中使用相同的逻辑,我们可以做到

    library(data.table)
    setDT(df)[, .SD[1L], gvkey]
    

    和

    aggregate(year~gvkey, df, head, 1)
    

    【讨论】:

      【解决方案2】:
      library(data.table)
      df = as.data.table(df)
      df = df[order(gvkey,year)]
      df[,`:=`(ipo_date=min(year)),by=c("gvkey")][,`:=`(year=NULL)]
      df = unique(df)
      

      【讨论】:

        【解决方案3】:

        这是一个单行解决方案:

        library(plyr)
        df <- data.frame(gvkey = c(1004, 1004, 1004, 1005, 1005),
                         year = c(1965, 1966, 1967, 1950, 1951))
        
        df_agg <- ddply(df, c('gvkey'), summarise, ipo_date = min(year))
        > df_agg
          gvkey ipo_date
        1  1004     1965
        2  1005     1950
        

        【讨论】:

          【解决方案4】:

          这应该可以解决问题:

          library(tidyverse)
          df %>% 
            group_by(gvkey) %>% 
            mutate(ipo_date = min(year)) %>% 
            select(-year) %>% 
            distinct()
          

          输出:

          # A tibble: 2 x 2
          # Groups:   gvkey [2]
            gvkey ipo_date
            <dbl>    <dbl>
          1  1004     1965
          2  1005     1950
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2019-07-31
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-07-15
            • 1970-01-01
            相关资源
            最近更新 更多