我已经开始逐渐从Excel转向R,但对于(相对简单的)计算仍然有些困难。
我想创建我的变量x的频率版本,我们称之为“xfrequency”。
请查看下面的数据样本。
所需的变量xfrequency基本上是计算在一定时期内(国家-年份)x的数量。在样本数据中,观察期是从1990年到1995年。因此,1994年加拿大总共接收了4个x。
或许有相关的函数可以做到这一点?谢谢!
country year x xfrequencyCAN 1990 1 1CAN 1991 0 0CAN 1992 1 2CAN 1993 0 0CAN 1994 2 4CAN 1995 1 5USA 1990 0 0USA 1991 2 2USA 1992 1 3USA 1993 0 0USA 1994 1 4USA 1995 0 0GER 1990 NA NAGER 1991 1 1GER 1992 0 0GER 1993 1 2GER 1994 2 4GER 1995 1 5
回答:
假设你的数据集在名为data
的变量中,使用data.table的示例:
library(data.table)setDT(data)data[is.na(x),x := 0] # 将NA值设为0,因为任何与NA相加的结果都是NAdata[, xfreq := cumsum(x), by=country]
结果如下:
country year x xfrequency xfreq 1: CAN 1990 1 1 1 2: CAN 1991 0 0 1 3: CAN 1992 1 2 2 4: CAN 1993 0 0 2 5: CAN 1994 2 4 4 6: CAN 1995 1 5 5 7: USA 1990 0 0 0 8: USA 1991 2 2 2 9: USA 1992 1 3 310: USA 1993 0 0 311: USA 1994 1 4 412: USA 1995 0 0 413: GER 1990 0 NA 014: GER 1991 1 1 115: GER 1992 0 0 116: GER 1993 1 2 217: GER 1994 2 4 418: GER 1995 1 5 5
这与你期望的输出不完全相同,但根据你的描述,xfreq列似乎是你想要的。
为了得到你确切的输出,我们可以在x为0时将xfreq重置为0:
> data[x==0,xfreq := 0]> data country year x xfrequency xfreq 1: CAN 1990 1 1 1 2: CAN 1991 0 0 0 3: CAN 1992 1 2 2 4: CAN 1993 0 0 0 5: CAN 1994 2 4 4
或者在一遍中使用测试:
data[, xfreq := ifelse(x==0,0L,cumsum(x)), by=country]