r - 每月计算列中条目的比率 - 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 ))
我希望我说得通。感谢您的任何帮助!
解决方案
您的帖子中有几件事没有加起来。
- 使用 R 4.0,您的示例数据
seed.seed(1)
不会产生预期的finish
,我看不出它应该如何。 - 您提到每个月的“s”与“l”的比率为
Col12_ratio
,但finish
data.frame 只有Col2_ratio
,这也与我从start
data.frame 得到的不匹配。我认为这是正确的拼写Col12_ratio
。 - 我不确定您是否真的在寻找“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)
推荐阅读
- sql-server - 如何在 TSQL 命令中连接字符串?
- sql - 在 oracle 中将数据从一个表移动到另一个表
- javascript - 如何在 Cloudflare Workers 中安装/使用 rclone
- nginx - 使用 nginx 的 Keycloak 重定向 url 将转到 http 而不是 https | 尝试了stackoverflow上可用的多种解决方案
- python - 如何从 stcipt var 中提取特定数据?
- tensorflow - Keras 有状态 LSTM 批量大小与训练大小警告
- python-3.x - 使用已部署的 Azure 函数从 Blob 存储下载文件非常慢
- arrays - 看不到数组的内容
- javascript - 为什么我的正则表达式忽略每个匹配项中的最后一个字符
- datetime - 无法在 talend 中的 tfileinputdelimited 中创建日期时间