gpt4 book ai didi

r - 将函数应用于行但引用不同的表

转载 作者:行者123 更新时间:2023-12-05 02:28:05 25 4
gpt4 key购买 nike

我有两张 table

df1 = data.frame("dates" = c(seq(as.Date("2020-1-1"), as.Date("2020-1-10"), by = "days")))
df2 = data.frame("observations" = c("a", "b", "c", "d"), "start" = as.Date(c("2019-12-30", "2020-1-1", "2020-1-5","2020-1-10")), "end"=as.Date(c("2020-1-3", "2020-1-2", "2020-1-12","2020-1-14")))

我想根据 df2 中的开始/停止日期,了解 df1 每天发生的观察期数。例如。 2020 年 1 月 1 日,观察 a 和 b 正在进行中,因此为“2”。

预期输出如下:

enter image description here

我尝试过使用求和

df1$number = sum(as.Date(df2$start) <= df1$dates & as.Date(df2$end)>=df1$dates)

但这只是对整个列值求和

然后我尝试为此创建一个自定义函数:

df1$number = apply(df1, 1, function(x) sum(df2$start <= x & df2$end>=x))

但它返回一个 NA 值。

然后我尝试在其中嵌入一个“ifelse”,但在 NA 上遇到了同样的问题

apply(df1, 1, function(x) sum(ifelse(df2$start <= x & df2$end>=x, 1, 0)))

任何人都可以提出问题所在吗?谢谢!

编辑:建议使用间隔连接,这不是我想要得到的 - 我认为用数字标签命名观察是导致混淆的原因。与进行 1:1 匹配相比,我试图找出一天内的观察总数。

问候唱歌

最佳答案

在函数 f 中定义比较,并通过 outer 传递,rowSums 就是您要找的。

f <- \(x, y) df1[x, 1] >= df2[y, 2] & df1[x, 1] <= df2[y, 3]
cbind(df1, number=rowSums(outer(1:nrow(df1), 1:nrow(df2), f)))
# dates number
# 1 2020-01-01 2
# 2 2020-01-02 2
# 3 2020-01-03 1
# 4 2020-01-04 0
# 5 2020-01-05 1
# 6 2020-01-06 1
# 7 2020-01-07 1
# 8 2020-01-08 1
# 9 2020-01-09 1
# 10 2020-01-10 2

关于r - 将函数应用于行但引用不同的表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72766497/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com