已经在论坛上搜索了一种解决方案,但找不到解决方案。
我在一个数据框(df1)中有关于公司财务的数据,而在另一个数据框(df2)中有有关收购的数据。数据格式如下。
df1 <- data.frame(ID=c('111111','111111', '222222', '333333', '444444'),
year=c(2010, 2011, 2010, 2011, 2011))
df2 <- data.frame(ID=c('111111', '111111', '111111', '111111', '333333'),
year=c(2010,2010,2010,2011,2011))´
我的目标是在df1中创建一个新列,该列具有对df2中的每个观察值进行计数的值,该值与df1中的ID和行的年份均匹配。我需要一个变量来计算每个公司每年的收购数量。以下是所需的输出。
#output should look like following in df1
# ID year count of observations in df2 per year
# 111111 2010 3
# 111111 2011 1
# 222222 2010 0
# 333333 2011 1
# 444444 2011 0
我真的想出一个解决方案,但是距离还不够。希望有人能解决这个问题。
提前谢谢!
答案 0 :(得分:3)
最好的方法可能是使用left_join,您只需要将NA更改为0:
df1 <- data.frame(ID=c('111111','111111', '222222', '333333', '444444'),
year=c(2010, 2011, 2010, 2011, 2011))
df2 <- data.frame(ID=c('111111', '111111', '111111', '111111', '333333'),
year=c(2010,2010,2010,2011,2011))
library(tidyverse)
df2 %>% count(ID, year) -> summ_df2
df1 %>% left_join(summ_df2)
#> Joining, by = c("ID", "year")
#> Warning: Column `ID` joining factors with different levels, coercing to
#> character vector
#> ID year n
#> 1 111111 2010 3
#> 2 111111 2011 1
#> 3 222222 2010 NA
#> 4 333333 2011 1
#> 5 444444 2011 NA
由reprex package(v0.2.1)于2019-01-29创建
一个连锁经营 添加了@Ronak Shah的以下评论
df1 <- data.frame(ID=c('111111','111111', '222222', '333333', '444444'),
year=c(2010, 2011, 2010, 2011, 2011))
df2 <- data.frame(ID=c('111111', '111111', '111111', '111111', '333333'),
year=c(2010,2010,2010,2011,2011))
library(tidyverse)
df2 %>%
count(ID, year) %>%
right_join(df1) %>%
replace_na(list(n = 0))
#> Joining, by = c("ID", "year")
#> Warning: Column `ID` joining factors with different levels, coercing to
#> character vector
#> # A tibble: 5 x 3
#> ID year n
#> <chr> <dbl> <dbl>
#> 1 111111 2010 3
#> 2 111111 2011 1
#> 3 222222 2010 0
#> 4 333333 2011 1
#> 5 444444 2011 0
由reprex package(v0.2.1)于2019-01-29创建
答案 1 :(得分:0)
非tidyverse解决方案。我知道这似乎比tidyverse
复杂,只是为了各种选择而共享。
df1 <- data.frame(ID=c('111111','111111', '222222', '333333', '444444'),
year=c(2010, 2011, 2010, 2011, 2011))
df2 <- data.frame(ID=c('111111', '111111', '111111', '111111', '333333'),
year=c(2010,2010,2010,2011,2011))
df1$key <- paste(df1$ID,df1$year,sep = "_")
df2$key <- paste(df2$ID,df2$year,sep = "_")
df1$count_of_year <- unlist(lapply(df1$key,function(x) {sum(df2$key %in% x)}))
df1 <- df1[,c(1,2,4)]
df1
#> ID year count_of_year
#> 1 111111 2010 3
#> 2 111111 2011 1
#> 3 222222 2010 0
#> 4 333333 2011 1
#> 5 444444 2011 0
由reprex package(v0.2.1)于2019-01-29创建