如何根据另一个变量的第一个条目创建新变量

how to to create new variable based on first entry of another variable

我创建了df

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

gvkey = 公司编号

我的数据框包含超过 1,200 个独特的 gvkeysyear 具有不同的起始值。

我想在 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
...

非常感谢!!!

您可以 select 每个 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和基础R中使用相同的逻辑,我们可以做到

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

aggregate(year~gvkey, df, head, 1)
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)

这应该可以解决问题:

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

这是一个单行解决方案:

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