R 基于间隔范围创建指标数据框

R 基于间隔范围创建指标数据框,r,dataframe,reshape2,R,Dataframe,Reshape2,我试图从R中一种非常特殊的“宽”数据框架中创建一个指标(“虚拟”)变量的“长”数据框架,该数据框架具有定义我的数据的年间隔范围 我所拥有的是这样的: f=data.frame(name=c("A","B","C"), year.start=c(1990,1994,1993),year.end=c(1994,1995,1993)) name year.start year.end 1 A 1990 1994 2 B 199

我试图从R中一种非常特殊的“宽”数据框架中创建一个指标(“虚拟”)变量的“长”数据框架,该数据框架具有定义我的数据的年间隔范围

我所拥有的是这样的:

f=data.frame(name=c("A","B","C"),
             year.start=c(1990,1994,1993),year.end=c(1994,1995,1993))

  name year.start year.end
1    A       1990     1994
2    B       1994     1995
3    C       1993     1993
更新:我已将year.start A的值从1993年的初始示例更改为1990年,以解决以下一些依赖于唯一值而不是间隔的答案。

我想要的是一个长的数据框,看起来像这样,在原始数据框中每个可能的年份都有一个条目,例如,1990年到1995年,其中1=存在,0=不存在

 name year indicator
A     1990   1
A     1991   1
A     1992   1
A     1993   1
A     1994   1
A     1995   0
B     1990   0
B     1991   0
B     1992   0
B     1993   0
B     1994   1
B     1995   1
C     1990   0
C     1991   0
C     1992   0
C     1993   1
C     1994   0
C     1995   0
尽管我尽了最大的努力,但我不知道如何用哈德利·维克汉姆的改造方案做到这一点


谢谢

这里是一个使用data.table的逐步细分

library(data.table)
f <- as.data.table(f)

## ALL OF NAME-YEAR COMBINATIONS
ALL <- f[, CJ(name=name, year=seq(min(year.start), max(year.end)))]

## WHICH COMBINATIONS EXIST
PRESENT <- f[, list(year = seq(year.start, year.end)), by=name]

## SETKEYS FOR MERGING
setkey(ALL, name, year)
setkey(PRESENT, name, year)

## INITIALIZE INDICATOR TO ZERO, THEN SET TO 1 FOR THOSE PRESENT
ALL[, indicator := 0]
ALL[PRESENT, indicator := 1]

ALL

   name year indicator
1:    A 1993         1
2:    A 1994         1
3:    A 1995         0
4:    B 1993         0
5:    B 1994         1
6:    B 1995         1
7:    C 1993         1
8:    C 1994         0
9:    C 1995         0
库(data.table)

f这里是一个使用data.table的逐步细分

library(data.table)
f <- as.data.table(f)

## ALL OF NAME-YEAR COMBINATIONS
ALL <- f[, CJ(name=name, year=seq(min(year.start), max(year.end)))]

## WHICH COMBINATIONS EXIST
PRESENT <- f[, list(year = seq(year.start, year.end)), by=name]

## SETKEYS FOR MERGING
setkey(ALL, name, year)
setkey(PRESENT, name, year)

## INITIALIZE INDICATOR TO ZERO, THEN SET TO 1 FOR THOSE PRESENT
ALL[, indicator := 0]
ALL[PRESENT, indicator := 1]

ALL

   name year indicator
1:    A 1993         1
2:    A 1994         1
3:    A 1995         0
4:    B 1993         0
5:    B 1994         1
6:    B 1995         1
7:    C 1993         1
8:    C 1994         0
9:    C 1995         0
库(data.table)

f其他人可能会对
重塑2
提出建议,但这里有一个基本的R解决方案:

years <- factor(unlist(f[-1]), levels=seq(min(f[-1]), max(f[-1]), by=1))
result <- data.frame(table(years, rep(f[[1]], length.out=length(years))))
#    years Var2 Freq
# 1   1990    A    1
# 2   1991    A    0
# 3   1992    A    0
# 4   1993    A    0
# 5   1994    A    1
# 6   1995    A    0
# 7   1990    B    0
# 8   1991    B    0
# 9   1992    B    0
# 10  1993    B    0
# 11  1994    B    1
# 12  1995    B    1
# 13  1990    C    0
# 14  1991    C    0
# 15  1992    C    0
# 16  1993    C    2
# 17  1994    C    0
# 18  1995    C    0

years其他人可能会对
reforme2
提出建议,但这里有一个基本的R解决方案:

years <- factor(unlist(f[-1]), levels=seq(min(f[-1]), max(f[-1]), by=1))
result <- data.frame(table(years, rep(f[[1]], length.out=length(years))))
#    years Var2 Freq
# 1   1990    A    1
# 2   1991    A    0
# 3   1992    A    0
# 4   1993    A    0
# 5   1994    A    1
# 6   1995    A    0
# 7   1990    B    0
# 8   1991    B    0
# 9   1992    B    0
# 10  1993    B    0
# 11  1994    B    1
# 12  1995    B    1
# 13  1990    C    0
# 14  1991    C    0
# 15  1992    C    0
# 16  1993    C    2
# 17  1994    C    0
# 18  1995    C    0

years另一个基本R解决方案

f=data.frame(name=c("A","B","C"),
         year.start=c(1993,1994,1993),year.end=c(1994,1995,1993), stringsAsFactors=F)
x <- expand.grid(unique(f$name),min(f1$year):max(f1$year)) 
names(x) <- c("name", "year")
x$indicator <- sapply(1:nrow(x), function(i) sum(x$name[i]==f$name & x$year[i] >=    f$year.start & x$year[i] <= f$year.end))
x[order(x$name),]
f=data.frame(name=c(“A”、“B”、“c”),
年份开始=c(199319941993),年份结束=c(199419951993),字符串系数=F)

x另一种碱性R溶液

f=data.frame(name=c("A","B","C"),
         year.start=c(1993,1994,1993),year.end=c(1994,1995,1993), stringsAsFactors=F)
x <- expand.grid(unique(f$name),min(f1$year):max(f1$year)) 
names(x) <- c("name", "year")
x$indicator <- sapply(1:nrow(x), function(i) sum(x$name[i]==f$name & x$year[i] >=    f$year.start & x$year[i] <= f$year.end))
x[order(x$name),]
f=data.frame(name=c(“A”、“B”、“c”),
年份开始=c(199319941993),年份结束=c(199419951993),字符串系数=F)

x这里有另一个解决方案,类似于上面的解决方案,其目的是简单明了:

zz           <- cbind(name=f[1],year=rep(min(f[-1]):max(f[-1]),each=nrow(f)))
zz$indicator <- as.numeric((f$name==zz$name & 
                            f$year.start<=zz$year & 
                            f$year.end  >=zz$year))
result       <- zz[order(zz$name,zz$year),]

zz这里有另一个解决方案,类似于上面的解决方案,其目的是简单明了:

zz           <- cbind(name=f[1],year=rep(min(f[-1]):max(f[-1]),each=nrow(f)))
zz$indicator <- as.numeric((f$name==zz$name & 
                            f$year.start<=zz$year & 
                            f$year.end  >=zz$year))
result       <- zz[order(zz$name,zz$year),]


zz注意:您的解决方案不太正确<代码>指标
应该是1(存在)或0(不存在),但您的
结果
对于1993年,C是2。这是因为您的解决方案计算了(A、B、C)在由
year.start
year.end
串在一起的向量中的出现次数[通过
unlist(…)
]。因为对于C来说,1993年既是开始也是结束,它被计算了两次。使用
result$Freq谢谢,@jlhoward。我知道这一点,应该在我的回答中提到这一点。不过,正如您所指出的,将任何2变为1是非常简单的。你也可以做
result这个一行的答案非常棒,但不太管用。它确实适用于我给出的简单示例。。。但当你改变一些东西,比如年份,它就失败了。从A开始到1990年。长数据框中的条目数应该是18(例如,三个名称中的每一个都是1990年至1995年),但实际上只有12个(三个名称中的每一个都是1990年、1993年、1994年、1995年)。也就是说,这个解决方案不考虑时间间隔,而只考虑唯一值。也许你应该在问题中提到这个要求?我已经更新了我的答案。对不起!我试图创建一个最小的示例,但结果太小了。我还可以更清楚地回答这个问题,现在这个问题已经解决了。你的答案仍然不起作用,因为从1991年到1993年,A也应该是1。注意:你的答案不太正确<代码>指标
应该是1(存在)或0(不存在),但您的
结果
对于1993年,C是2。这是因为您的解决方案计算了(A、B、C)在由
year.start
year.end
串在一起的向量中的出现次数[通过
unlist(…)
]。因为对于C来说,1993年既是开始也是结束,它被计算了两次。使用
result$Freq谢谢,@jlhoward。我知道这一点,应该在我的回答中提到这一点。不过,正如您所指出的,将任何2变为1是非常简单的。你也可以做
result这个一行的答案非常棒,但不太管用。它确实适用于我给出的简单示例。。。但当你改变一些东西,比如年份,它就失败了。从A开始到1990年。长数据框中的条目数应该是18(例如,三个名称中的每一个都是1990年至1995年),但实际上只有12个(三个名称中的每一个都是1990年、1993年、1994年、1995年)。也就是说,这个解决方案不考虑时间间隔,而只考虑唯一值。也许你应该在问题中提到这个要求?我已经更新了我的答案。对不起!我试图创建一个最小的示例,但结果太小了。我还可以更清楚地回答这个问题,现在这个问题已经解决了。你的答案仍然不起作用,因为从1991年到1993年,A也应该是1。这个答案适用于给出的例子——谢谢但正如@matthew plourde给出的一行回答一样,当初始数据帧中没有给出所有唯一值时,答案将失败。也就是说,它没有考虑到我要寻找的时间间隔。这个答案适用于给出的示例--谢谢但正如@matthew plourde给出的一行回答一样,当初始数据帧中没有给出所有唯一值时,答案将失败。也就是说,它没有考虑我正在寻找的时间间隔。这适用于更复杂的时间间隔,例如当我将year.start设置为A到1990时,在结果中正确地创建了18行。谢谢不客气。如果这对你有用,请考虑选择答案。这工作在更复杂的时间间隔上,比如当我设置年份时。开始A到1990,在结果中正确地创建18行。谢谢不客气。如果这对你有用,请考虑选择答案。就像@ JLHOWALD,这工作在更复杂的时间间隔上,比如当我设置年份时。开始A到1990,在结果中正确地创建18行。谢谢@bshor,这是带有
seq
CJ
的结果,就像@jlhoward一样,它在更复杂的时间间隔上工作,例如当我将a的year.start设置为1990时,在结果中正确地创建了18行。谢谢@b因此,这是
CJ
seq