1

非常新,所以让我知道这是否要求太多。我正在尝试将 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 将是第三列中的前三行。

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;博士我还不能用一句话来解释它所以......对不起。

编辑:我所说的完整和不完整变量的可视化。截屏

4

2 回答 2

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

如果您不熟悉melting 和reshape2包,您可能希望逐行运行它,并检查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)
于 2012-04-18T22:14:56.547 回答
0

假设这是在名称 == 'dfrm' 的 data.frame 中

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

感谢@WojciechSobala 注意到我丢失的括号。对于识别缺失值在哪一列中的问题,可以创建一个列表: 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 
于 2012-04-18T04:21:06.263 回答