非常新,所以请告诉我这是否要求太多。 我试图将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
答案 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
如果您不熟悉melt
和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)