【问题标题】:Adding new column in dataframe counting rows from another dataframe在数据帧中添加新列计数来自另一个数据帧的行
【发布时间】:2019-06-22 09:21:45
【问题描述】:

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

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

我确实尝试过想出一个解决方案,但还不够接近。希望有人能解决这个问题。

提前谢谢你!

【问题讨论】:

    标签: r


    【解决方案1】:

    可能最好的方法是使用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 年 1 月 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 年 1 月 29 日创建

    【讨论】:

    • 谢谢,这很有帮助。但是,似乎仅此代码不会将新列“n”添加到数据框 df1。有没有快速的解决方案?
    • 考虑阅读 left_join 和 right_join 文档。在第一个示例中,left_join 函数保留 df1 中的所有值并添加仅存在于 df2 中的列“n”。在“单链解决方案”中,诀窍是使用 right_join 也保留 df1 并添加“n”列。您不能简单地将 n 列添加到 df1,因为 df1 中不存在某些值。
    • " 您不能简单地将 n 列添加到 df1,因为 df1 中不存在一些值"
    • 实际上,您正在 df1 中创建一个具有相同值的 data.frame 并添加一个新列“n”,这与在 df1 中创建一个“n”列相同...
    • 如果您认为您的问题已经解决,请检查是否已回答:)
    【解决方案2】:

    非 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 年 1 月 29 日创建

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-31
      • 1970-01-01
      • 1970-01-01
      • 2018-03-09
      • 1970-01-01
      • 2019-07-10
      • 1970-01-01
      • 2016-07-05
      相关资源
      最近更新 更多