如何基于另一个变量的第一个条目创建新变量

时间:2019-12-16 11:02:25

标签: r conditional-statements transform

我已经创建了df

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

gvkey =公司ID

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

我想在df中创建一个名为ipo_date的列,该列等于特定year的{​​{1}}列中的第一个条目。

gvkey

然后,我要删除 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

非常感谢您!

4 个答案:

答案 0 :(得分: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和基数R中使用相同的逻辑,我们可以做到

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

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

答案 1 :(得分: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)

答案 2 :(得分:1)

这应该可以解决问题:

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

答案 3 :(得分:1)

这里是一种解决方案:

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