我已经创建了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
非常感谢您!
答案 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