首页 > 解决方案 > 每月计算列中条目的比率 - R

问题描述

我想计算 Col1 中每个单独月份的“无 NA”值与“NA”值的比率,并将其输入到新列(Col1_ratio)中。同样,我想计算每个月的“s”与“l”的比率并将其输入到一个新列(Col12_ratio)中。我希望月份是自开始以来的月份,因此值可能高于 12。有没有办法做到这一点?

开始:

set.seed(1)
start = data.frame(
Date = c(sample(seq(as.Date('2010/01/01'), as.Date('2010/04/01'), by="week"), 5), as.Date('2011/01/01')),
Col1 = c("g",NA,NA,"f",NA,NA),
Col2 = c("s","l","s","s","l","s"))

预期输出:

finish =  data.frame(Month = c(1,2,3,13),
                     Col1_ratio = c(0.33,0,1,0),
                     Col2_ratio = c(0.33,1,1,1 ))

我希望我说得通。感谢您的任何帮助!

标签: rdataframe

解决方案


您的帖子中有几件事没有加起来。

  1. 使用 R 4.0,您的示例数据seed.seed(1)不会产生预期的finish,我看不出它应该如何。
  2. 您提到每个月的“s”与“l”的比率为Col12_ratio,但finishdata.frame 只有Col2_ratio,这也与我从startdata.frame 得到的不匹配。我认为这是正确的拼写Col12_ratio
  3. 我不确定您是否真的在寻找“s”与“l”的比率,当没有“l”时,它可能会变为无限,或者每月寻找“s”的分数。

下面是一种data.table方法,可以让你接近你想要的。

library(data.table)
set.seed(1)
start = data.frame(
    Date = c(sample(seq(as.Date('2010/01/01'), as.Date('2010/04/01'), by="week"), 5), as.Date('2011/01/01')),
    Col1 = c("g",NA,NA,"f",NA,NA),
    Col2 = c("s","l","s","s","l","s"))

# show sorted input
start[order(start$Date),]
#>         Date Col1 Col2
#> 4 2010-01-01    f    s
#> 5 2010-01-08 <NA>    l
#> 2 2010-01-22 <NA>    l
#> 3 2010-02-12 <NA>    s
#> 1 2010-02-26    g    s
#> 6 2011-01-01 <NA>    s

out <- data.table(start, key="Date")[, Date := round(as.IDate(Date), "months")][, 
    .(Col1_ratio=mean(!is.na(Col1)), 
      # Col2_ratio=sum(Col2=="s", na.rm=TRUE)/sum(Col2=="l", na.rm=TRUE)), by=Date]
      Col2_ratio=mean(Col2=="s")), by=Date] # replace with row above if you want s/l ratio
out[, Date:= which(seq(min(Date), max(Date), "month") %in% Date)]
setnames(out, "Date", "Month")[]
#>    Month Col1_ratio Col2_ratio
#> 1:     1  0.3333333  0.3333333
#> 2:     2  0.5000000  1.0000000
#> 3:    13  0.0000000  1.0000000

reprex 包于 2020-07-01 创建(v0.3.0)


推荐阅读