子设置面板数据

时间:2012-04-18 04:10:47

标签: r statistics economics

非常新,所以请告诉我这是否要求太多。 我试图将R中的面板数据子设置为两个不同的类别;一个具有完整的变量信息,另一个具有不完整的变量信息。我的数据如下:

Person     Year Income Age Sex
    1      2003  1500   15  1
    1      2004  1700   16  1
    1      2005  2000   17  1
    2      2003  1400   25  0
    2      2004  1900   26  0
    2      2005  2000   27  0

我需要做的是遍历每一列(不是第1列和第2列),如果变量的数据已满(变量由第一列中的id定义,然后是列名,在上图中)一个例子是person1Income)将其返回到数据集。否则将其放在不同的数据集中。这是我的元代码和给出上述数据应该做的一个例子。注意:我通过它们的id名称调用变量然后调用列名,例如变量person1Income将是第3列中的前三行。

for(each variable in all columns except 1 and 2 in data set) if (variable = FULL) { return to data set "completes" }
else {put in data set "incompletes"}
completes = person1Income, person2Income, person1Age, person2Age, person1Sex, person2 sex
incompletes = {empty because the above info is full}

我理解是否有人无法完全回答这个问题,但我们非常感谢您的帮助。如果我的目标不明确,请告诉我,我会尽力澄清。

tl; dr我还不能用一句话来解释它......抱歉。

编辑:通过完整和不完整的变量可视化我的意思。 screenshot

2 个答案:

答案 0 :(得分:0)

我们假设这是在一个名为=='dfrm'

的data.frame中
completes <- dfrm[ complete.cases(dfrm[-(1:2)]) ,]
incompletes <- dfrm[ !complete.cases(dfrm[-(1:2)]) ,]

感谢@WojciechSobala注意到我失踪的parens。对于识别缺失值在哪一列中的问题,可以创建一个列表:id的列表很简单。识别哪些列缺少值也很容易提供,但我不知道你所说的“该列中与id变量对应的值”是什么意思,因为它们都是NA。对于识别步骤,您可以使用:

apply(incompletes, 1, function(x) c(x[1], x[2], which(is.na(x[-(1:2)]))))

我现在看到你在问什么。我还没有解决方案,但是在枚举和处理通过对两个列值进行交叉分类而形成的类别时,让我向您展示可能帮助的几个R函数:

dat <- structure(list(Person = c(1L, 1L, 1L, 2L, 2L, 2L), Year = c(2003L, 
2004L, 2005L, 2003L, 2004L, 2005L), Income = c(1500L, NA, 2000L, 
1400L, 1900L, 2000L), Age = c(15L, 16L, 17L, 25L, 26L, 27L), 
    Sex = c(1L, 1L, 1L, 0L, 0L, 0L)), .Names = c("Person", "Year", 
"Income", "Age", "Sex"), row.names = c(NA, -6L), class = "data.frame")

completes <-  lapply( split(dat[ , 3:5], dat$Person), function(x)  sapply(x, function(y) { if( all( !is.na(y)) ) { y } else { NA} })  )

$`1`
$`1`$Income
[1] NA

$`1`$Age
[1] 15 16 17

$`1`$Sex
[1] 1 1 1


$`2`
     Income Age Sex
[1,]   1400  25   0
[2,]   1900  26   0
[3,]   2000  27   0

 incompletes <- lapply( split(dat[ , 3:5], dat$Person), function(x)  sapply(x, function(y) { if( !all( !is.na(y)) ) { y } else { NA} }) )

$`1`
$`1`$Income
[1] 1500   NA 2000

$`1`$Age
[1] NA

$`1`$Sex
[1] NA


$`2`
Income    Age    Sex 
    NA     NA     NA 

答案 1 :(得分:0)

使用你的照片,这里是你想要的东西。它可能是冗长的,其他人可能有更优雅的方式,但它完成了工作:

library("reshape2")

con <- textConnection("Person Year Income Age Sex
  1      2003  1500   15  1
  1      2004  1700   16  1
  1      2005  2000   17  1
  2      2003  1400   25  0
  2      2004  1900   NA  0
  2      2005  2000   27  0
  3      2003  NA   25  0
  3      2004  1900   NA  0
  3      2005  2000   27  0")
pnls <- read.table(con, header=TRUE)

# reformat table for easier processing
pnls2 <- melt(pnls, id=c("Person"))
# and select those rows that relate to values
# of income and age
pnls2 <- subset(pnls2,
              variable == "Income" | variable == "Age")

# create column of names in desired format (e.g Person1Age etc)
pnls2$name <- paste("Person", pnls2$Person, pnls2$variable, sep="")

# Collect full set of unique names
name.set <- unique(pnls2$name)
# find the incomplete set
incomplete <- unique( pnls2$name[ is.na(pnls2$value) ]) 
# then find the complement of the incomplete set
complete <- setdiff(name.set, incomplete) 

# These two now contain list of complete and incomplete variables
complete
incomplete

如果您不熟悉meltreshape2包,则可能需要逐行运行,并在不同阶段检查pnls2的值以了解如何这很有效。

编辑:添加代码以按照@bstockton的要求编译值。我确信有一个更合适的R成语可以做到这一点,但再一次,在没有更好的答案的情况下:这是有效的

# use these lists of complete and incomplete variable names
# as keys to collect lists of values for each variable name
compile <- function(keys) {
    holder = list()
    for (n in keys) {
        holder[[ n ]] <- subset(pnls2, pnls2$name == n)[,3]
    }
    return( as.data.frame(holder) )
}

complete.recs <- compile(complete)
incomplete.recs <- compile(incomplete)