检查面板观测值的因子值变化

时间:2019-10-22 12:29:30

标签: r data.table diff factors

我有一个面板数据集,如下所示:

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)

我不确定为什么会发生这种情况(在示例中似乎无法重现)。

有什么想法吗?

1 个答案:

答案 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的差值将与上面显示的类似。