在数据框中添加新列以计算另一个数据框中的行

时间:2019-01-29 09:33:15

标签: r

已经在论坛上搜索了一种解决方案,但找不到解决方案。

我在一个数据框(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

我真的想出一个解决方案,但是距离还不够。希望有人能解决这个问题。

提前谢谢!

2 个答案:

答案 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创建