R 基于间隔范围创建指标数据框
我试图从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
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