从数据框中删除NA而不删除整个行/列

时间:2014-03-21 13:39:30

标签: r na

我正在分析一些实验的试验数据,我们给参与者提供了来自190对的60对听觉刺激,以4分制进行评分。我得到了很多缺失值,因为参与者每次都评定不同的对。

我真的不关心哪个参与者说了什么,我只需要同一对的所有等级都在同一行中,这样我就可以执行Light的Kappa测试,以获得n对中每对的评估者协议kappam.light(irr package)。

这是15个参与者的数据头,其中n是对的编号,m是参与者:

> head(my.data)
   [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15]
1   NA    1   NA    1   NA   NA   NA   NA    2     2    NA    NA    NA     3    NA
2   NA    3   NA   NA    3   NA   NA   NA    3     3    NA    NA     4    NA     3
3   NA   NA    1   NA   NA    4   NA    1   NA    NA     1     3    NA    NA     3
4   NA   NA    2   NA    1   NA   NA    1   NA    NA    NA    NA    NA    NA    NA
5    1   NA   NA    1   NA   NA   NA    1   NA    NA     4     1    NA    NA    NA
6    2   NA   NA   NA    1   NA   NA   NA    1     3    NA    NA    NA     2    NA

我想要的输出(如果可能)如下:

   [,1] [,2] [,3] [,4] [,5] [,6]
1    1    1    2    2    3
2    3    3    3    3    4    3
3    1    4    1    1    3    3
4    2    1    1   
5    1    1    1    4    1  
6    2    1    1    3    2   

我不确定R是否允许在数据帧/矩阵中使用不同的行长度,但是尽可能地删除尽可能多的缺失值会很好,因此kappam.light不会忽略整个行。

3 个答案:

答案 0 :(得分:4)

您可以轻松摆脱NA中的list值。另一方面,matrixdata.frame都需要具有恒定的行长度。这是一种方法:

# list removing NA's
lst <- apply(my.data, 1, function(x) x[!is.na(x)])
# maximum lenght
ll <- max(sapply(lst, length))
# combine 
t(sapply(lst, function(x) c(x, rep(NA, ll-length(x)))))

答案 1 :(得分:3)

如果您不介意将所有NA列留在m2中,则可以省略第二行代码:

m2 <- t(apply(m, 1, function(x) x[order(is.na(x))])) # sort NAs to end of ea row
m2[, !!colSums(!is.na(m2))] 

最后一行可以是:m2[, apply(m2, 2, function(x) any(!is.na(x)))]

结果是:

     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    1    1    2    2    3   NA
[2,]    3    3    3    3    4    3
[3,]    1    4    1    1    3    3
[4,]    2    1    1   NA   NA   NA
[5,]    1    1    1    4    1   NA
[6,]    2    1    1    3    2   NA

注意:我们将此作为输入m

m <-
structure(c(NA, NA, NA, NA, 1L, 2L, 1L, 3L, NA, NA, NA, NA, NA, 
NA, 1L, 2L, NA, NA, 1L, NA, NA, NA, 1L, NA, NA, 3L, NA, 1L, NA, 
1L, NA, NA, 4L, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 1L, 
1L, 1L, NA, 2L, 3L, NA, NA, NA, 1L, 2L, 3L, NA, NA, NA, 3L, NA, 
NA, 1L, NA, 4L, NA, NA, NA, 3L, NA, 1L, NA, NA, 4L, NA, NA, NA, 
NA, 3L, NA, NA, NA, NA, 2L, NA, 3L, 3L, NA, NA, NA), .Dim = c(6L, 
15L), .Dimnames = list(NULL, NULL))

下次请使用dput在此表单中提供您的数据。

答案 2 :(得分:2)

这样的事情会起作用吗?

# initialize empty data frame
datt <- data.frame()

library(plyr)

for(i in 1:nrow(my.data)){
    myd <- my.data[i, ]
    myd <- myd[, !is.na(myd)]
    names(myd) <- 1:length(myd)
    datt <- rbind.fill(datt, myd)
}

datt
  1 2 3  4  5  6
1 1 1 2  2  3 NA
2 3 3 3  3  4  3
3 1 4 1  1  3  3
4 2 1 1 NA NA NA
5 1 1 1  4  1 NA
6 2 1 1  3  2 NA