我有一个面板数据集,如下所示:
library(plm)
library(Hmisc)
library(data.table)
set.seed(1)
DT <- data.table(panelID = sample(50,50), # Creates a panel ID
Country = c(rep("Albania",30),rep("Belarus",50), rep("Chilipepper",20)),
some_NA = sample(0:5, 6),
some_NA_factor = sample(0:5, 6),
Group = c(rep(1,20),rep(2,20),rep(3,20),rep(4,20),rep(5,20)),
Time = rep(seq(as.Date("2010-01-03"), length=20, by="1 month") - 1,5),
norm = round(runif(100)/10,2),
Income = round(rnorm(10,-5,5),2),
Happiness = sample(10,10),
Sex = round(rnorm(10,0.75,0.3),2),
Age = sample(100,100),
Educ = round(rnorm(10,0.75,0.3),2))
DT [, uniqueID := .I] # Creates a unique ID
DT[DT == 0] <- NA # https://stackoverflow.com/questions/11036989/replace-all-0-values-to-na
DT$some_NA_factor <- factor(DT$some_NA_factor)
DTp <- plm::pdata.frame(DT, index= c("panelID", "Time"))
我想为每个小组观察评估some_NA_factor
还是例如Country
从一个时间段到另一个时间段的变化(1
的变化和{{1} })。我想写类似的东西:
0
但是当涉及到因素时,我不知道该怎么写。如果将其应用于data.table,我有望得到:
setDT(DT)[, difference := c(-1,1)*diff(some_NA_factor), by=panelID]
如果我将相同的内容应用于Warning messages:
1: In Ops.factor(c(-1, 1), diff(weight)) : ‘*’ not meaningful for factors
。我得到:
pdata.frame
另外,将其应用于我的实际数据时,出现以下错误:
setDT(DTp)[, difference := c(-1,1)*diff(some_NA_factor), by=panelID]
Error in alloc.col(x) :
Internal error: length of names (14) is not length of dt (13)
我不确定为什么会发生这种情况(在示例中似乎无法重现)。
有什么想法吗?
答案 0 :(得分:1)
让我们逐步进行。
some_NA_factor
还是例如Country
从一个时间段到另一个时间段的变化(1为变化,0为不变)。您提供了以下代码:
# actual code:
setDT(DT)[, difference := c(-1,1)*diff(some_NA_factor), by=panelID]
我可以在那看到一些问题。首先,您不需要setDT(DT)
:您已将DT定义为data.table,因此无需再次将其转换为已经存在的数据。其次,如果您希望零不改变而1不变,那么您期望乘以c(-1, 1)
得到什么呢?最后也是最重要的一点,乘法对因子没有意义,因此我们需要将diff
转换为数字:
# proposed code:
DT[, difference := 1*(diff(as.numeric(some_NA_factor)) != 0), by=panelID]
在这里,我们正在计算数字矢量的差,即数字,并评估它是否不同于零(这将返回TRUE
)。我们将其转换为数字乘以1(TRUE
等于1)。
DTp
中的因素我没有安装{plm}
,但是在阅读文档时,似乎plm::pdata.frame
函数返回了类pdata.frame
的对象。我不确定setDT
是否能够隐蔽该特定类,所以如果我是我,我会先将该pdata.frame
对象转换为data.frame(它使用自己的S3方法),然后然后到data.table:
library(plm)
DTp <- setDT(as.data.frame(pdata.frame(DT, index= c("panelID", "Time"))))
计算some_NA_factor
的差值将与上面显示的类似。