【问题标题】:Remove NAs from data frame without deleting entire rows/columns从数据框中删除 NA,而不删除整个行/列
【发布时间】:2014-03-21 13:39:29
【问题描述】:

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

我真的不在乎哪个参与者说了什么,我只需要同一对的所有评级都在同一行中,这样我就可以对 n 中的每一对进行 Light's Kappa 测试,以获得评级者间的一致性kappam.light(irr 包)。

这是我的 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 就不会忽略整行。

【问题讨论】:

    标签: r na


    【解决方案1】:

    您可以轻松摆脱list 中的NA 值。另一方面,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,虽然我会使用 apply(my.data, 1, Filter, f=Negate(is.na)) 来获得功能上的可爱。
    • 这正是我想要的!我将研究您用来学习正确使用它们的应用函数。谢谢!
    【解决方案2】:

    如果您不介意将所有 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在此表单中提供您的数据。

    【讨论】:

    • 我不知道dput,但它看起来真的很有帮助!谢谢你的提示;从现在开始我会使用它。
    【解决方案3】:

    这样的东西有用吗?

    # 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
    

    【讨论】:

      猜你喜欢
      • 2022-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-01
      • 1970-01-01
      • 2019-09-26
      • 1970-01-01
      相关资源
      最近更新 更多