我有一个名为 laws
的 df,每个法律都有一行(每个 id 一个):
laws <- data.frame(id=c(1,2,3),beginyear=c(2001,2002,2005),endyear=c(2003,2005,2006), law1=c(0,0,1), law2=c(1,0,1))
我想从中创建第二个名为
idyear
的行,每个 ID 和年份都有一行:idyear <- data.frame(id=c(rep(1,6),rep(2,6),rep(3,6)), year=(rep(c(2001:2006),3)), law1=c(rep(0,16),1,1), law2=c(1,1,1,rep(0,13),1,1))
我如何有效地编写一些代码来从
idyear
df 获取 laws
df 输出?如果 idyear$year
是 >= laws$beginyear
AND idyear$year
是 <= laws$endyear
,则这两个定律变量是指示变量 == 1。我是 R 的初学者,但我愿意尝试任何事情(应用、循环等)来让它发挥作用。
最佳答案
使用 tidyverse 的解决方案。最后一个 as.data.frame()
是可选的,它只是将 tbl
转换为数据帧。
library(tidyverse)
idyear <- laws %>%
mutate(year = map2(beginyear, endyear, `:`)) %>%
unnest() %>%
complete(id, year = full_seq(year, period = 1L), fill = list(law1 = 0L, law2 = 0L)) %>%
select(-beginyear, -endyear) %>%
as.data.frame()
idyear
# id year law1 law2
# 1 1 2001 0 1
# 2 1 2002 0 1
# 3 1 2003 0 1
# 4 1 2004 0 0
# 5 1 2005 0 0
# 6 1 2006 0 0
# 7 2 2001 0 0
# 8 2 2002 0 0
# 9 2 2003 0 0
# 10 2 2004 0 0
# 11 2 2005 0 0
# 12 2 2006 0 0
# 13 3 2001 0 0
# 14 3 2002 0 0
# 15 3 2003 0 0
# 16 3 2004 0 0
# 17 3 2005 1 1
# 18 3 2006 1 1
关于r - 将每个 id 和法律(带有开始和结束年份)的一行数据框转换为一个文件,每个 id 和年份都有一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48029629/