【发布时间】:2026-01-08 08:45:01
【问题描述】:
我正在尝试通过组合来自两个data.frames 的数据来使用ifelse 创建一个新变量(类似于this 问题,但没有因素)。
我的问题是 df1 具有年度数据,而 df2 中的变量是时间聚合的:例如df1 有多个 obs (1997,1998,...,2005),df2 只有一个范围 (1900-2001)。
为了说明,一个 2x2 的例子看起来像
df1$id <- c("2","20")
df1$year <- c("1960","1870")
df2$id <- df1$id
df2$styear <- c("1800","1900")
df2$endyear <- c("2001","1950")
我想将两者结合起来,使 id(两者中都存在相同的变量)匹配,此外,df1 中的年份在df2 的范围内。我尝试了以下
df1$new.var <- ifelse(df1$id==df2$id & df1$year>=df2$styear &
df1$year<df2$endyear,1,0)
理想情况下应该分别返回 1 和 0。
但我收到警告消息:
1:在 df1$id == df2$id :更长的对象长度不是的倍数 更短的物体长度
2:在 df1$year >= df2$styear :更长的对象长度不是 短物体长度的倍数
3:在 df1$year
为了记录,“真实的”df1 有 500 个 obs,df2 有 14 个。我怎样才能做到这一点?
编辑:我意识到df2 中的一些 obs 是重复的,有多个句点,例如
id styear endyear
1 1800 1915
1 1950 2002
2 1912 1988
3 1817 2000
所以,我相信我需要的是类似双 ifelse 的东西:
df1$new.var <- ifelse(df1$id==df2$id & df1$year>=df2$styear &
df1$year<df2$endyear | df1$year>=df2$styear &
df1$year<df2$endyear,1,0)
显然,这行不通,但它是摆脱重复问题的一种方法。
例如,如果id=1 在df1$year=1801 中,它将通过第一个年份范围测试(1801 在 1800-1915 之间),但第二个不通过(1801 不在 1950-2002 之间),所以它只编码一次,没有添加额外的行(当前重复添加额外的行)。
【问题讨论】:
-
@Bulat 你好,其他人也推荐了 foverlaps,我似乎无法让它工作 - 说“重叠连接中不允许重复列。这可能会在未来改变。”
-
你能提供一个可重现的例子吗?
标签: r if-statement dataframe dplyr