如何以行方式显示缺失变量的名称?

时间:2016-03-27 18:06:52

标签: r missing-data

我确实有一个问题,我无法独自解决。对不起我是新手,我已经尝试了很多不同的东西。 我有一个包含23个参与者和40个变量的数据框。我想生成一个新的文本文件,说明每个参与者都缺少WHICH变量。我做的是:

miss_val=vector(mode='list',length=num_participants)
for ( i in 1:num_participants){
  miss_val[i]=sum(is.na(data[i,]))
}

给出了每个参与者缺失值的总和。现在我想为每个参与者生成一个句子,指定缺少哪些变量。我使用which(is.na(data[i,])只给了我不同缺失值的位置 - 我怎样才能得到这些名字?我也尝试过:colnames( which( is.na (data[i,])它也不起作用。

3 个答案:

答案 0 :(得分:0)

没有提供数据,但您可以尝试这样做:

 apply(dat, 1, function(x) { list(names(x)[ is.na(x) ] } )

结果不是数据帧,而是一个列表,其第n个条目的字符值是按行丢失元素的列名。

> dat <- data.frame( x=c(NA, 1:4),y=c("a",NA,"b","c","d"), z=c( NA, 1:3,NA))
> apply(dat, 1, function(x) { list(names(x)[ is.na(x) ]) } )[[1]]
[[1]]
[1] "x" "z"

> apply(dat, 1, function(x) { list(names(x)[ is.na(x) ]) } )
[[1]]
[[1]][[1]]
[1] "x" "z"


[[2]]
[[2]][[1]]
[1] "y"


[[3]]
[[3]][[1]]
character(0)


[[4]]
[[4]][[1]]
character(0)


[[5]]
[[5]][[1]]
[1] "z"

我想人们也可能会在列名称上考虑sapplylapply,然后cbind() - do.call编辑。这就是我想出的:

 do.call(cbind, lapply(names(dat) , function (x) c(NA,x)[ 1+is.na(dat[[x]]) ] ))
     [,1] [,2] [,3]
[1,] "x"  NA   "z" 
[2,] NA   "y"  NA  
[3,] NA   NA   NA  
[4,] NA   NA   NA  
[5,] NA   NA   "z" 

需要在is.na的结果中添加1,逐列应用以创建索引以选择列名称或NA。

答案 1 :(得分:0)

如果不了解数据的外观,就很难评估。但是,您可以尝试使用sapply()函数。此函数可以循环遍历数据框中的变量并返回列表对象,该列表对象在存储的内容方面非常灵活。这是一个可能适合您的场景的示例:

# construct silly data.frame
temp <- data.frame("a"=1:10, "aa"=rep(1:5, 2), "b"=rnorm(10), 
"c"=sample(c("good", "bad", "ugly"), 10, replace=TRUE))
# build in some missing values
temp$a[c(1,5)] <- NA
temp$b[c(3,7, 9)] <- NA
temp$c[c(2,5)] <- NA
# take a peek at the data
temp
# construct empty list to store names of missing vars
missingVars <- list()
# loop through observations
for(i in 1:nrow(temp)) {
  # subset to one row data set
  obs.row <- temp[i,]
  # fill in missing var list with names of variables that are missing
  missingVars[[paste0("obs.",i)]] <- 
    names(obs.row)[unlist(sapply(obs.row, is.na))]
}

根据您所描述的内容,这应该可行。然后,您可以使用行号提取缺失变量的名称:

missingVars[[1]]

或使用list元素的名称:

missingVars[["obs.1"]]

将为第一次观察提取缺失变量的名称。

答案 2 :(得分:0)

假设数据如下:

setInterval(function(){
    var pack = {
        player:Player.update(),
        platform:Platform.update()
    }
   for (var i in SOCKET_LIST) {
        var socket = SOCKET_LIST[i];
        io.sockets.in(socket.room).emit('newPositions', pack);
    }

}, 30);

我是当前参与者检查丢失的变量:

    particpant       var1       var2
  1          1 0.74261292  0.2699047
  2          2 0.08523502 -0.2588741
  3          3         NA  1.3995776
  4          4 0.12567631  0.8855174
  5          5 0.44244614 -0.3241024

您可以按以下方式使用colnames来获取NA的列名称。注意colnames的用法。参数是整个数据集,然后我们使用哪个函数的返回值索引到向量:

i <- 3

哪个会输出:

colnames(data)[which(is.na(data[i,]))]
相关问题