如何根据另一个变量的第一个条目创建新变量
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 个独特的 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
...
非常感谢!!!
您可以 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
我创建了df
gvkey year
1 1004 1965
2 1004 1966
3 1004 1967
4 1005 1950
5 1005 1951
...
gvkey
= 公司编号
我的数据框包含超过 1,200 个独特的 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
...
非常感谢!!!
您可以 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