【问题标题】:sieve out non-NA entries from data frame while retaining rows with only NA从数据框中筛选出非 NA 条目,同时保留只有 NA 的行
【发布时间】:2016-02-03 17:55:36
【问题描述】:

我正在寻找一种更有效的方法(就代码长度而言)将data.frame 从:

#   V1 V2 V3 V4 V5 V6 V7 V8 V9
# 1  1  2  3 NA NA NA NA NA NA
# 2 NA NA NA  3  2  1 NA NA NA
# 3 NA NA NA NA NA NA NA NA NA
# 4 NA NA NA NA NA NA NA NA NA
# 5 NA NA NA NA NA NA 1  2  3

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

也就是说,我想删除多余的 NA,但正确地表示只有 NA 的行。

我编写了以下函数来完成这项工作,但我确信有一种更短的方法可以实现同样的目的。

#Dummy data.frame
data <- matrix(c(1:3, rep(NA, 6), 
          rep(NA, 3), 3:1, rep(NA, 3), 
          rep(NA, 9),
          rep(NA, 9),
          rep(NA, 6), 1:3),
          byrow=TRUE, ncol=9)
data <- as.data.frame(data)

sieve <- function(data) {

        #get a list of all entries that are not NA
        cond <- apply(data, 1, function(x) x[!is.na(x)])
        #set integer(0) equal to NA
        cond[sapply(cond, function(x) length(x)==0)] <- NA

        #check how many items there are in non-empty rows
        #(rows are either empty or contain the same number of items)
        n <- max(sapply(cond, length))

        #replace single NA with n NAs, where n = number of items
        #first get an index of entries with single NAs
        index <- (1:length(cond)) [sapply(cond, function(x) length(x)==1)]
        #then replace each entry with n NAs
        for (i in index) cond[[i]]  <- rep(NA, n)

        #turn list into a data.frame
        cond <- matrix(unlist(cond), nrow=length(cond), byrow=TRUE)
        cond
}

sieve(data)

我的问题类似于this question,关于提取参与者分配的条件(我收到了很好的答案)。我尝试将这些答案扩展到当前的虚拟数据,但到目前为止没有成功。因此我的自定义函数相当冗长。


编辑:关于我为什么要问这个问题的附加信息:第一个数据框表示实验的原始输出,在该实验中,我将参与者分配到三个条件之一(为简单起见,此处使用 3)。在每种情况下,参与者都阅读了不同的场景,但随后回答了关于他们阅读过的场景的相同问题。 Qualtrics 在V1V3列中记录第一个条件参与者的答案,在V4V6列中记录第二个条件参与者的答案,在V7列中记录第三个条件参与者的答案通过V9。 (如果这组问题包含 4 个问题,则列 V1V4 用于第一个条件参与者的答案,V2V8 列用于第二个条件参与者的答案...... )。


【问题讨论】:

  • 您能否解释一下为什么您的数据目前使用不同的变量(列)来处理您想要折叠成相同变量的数据?
  • 除了所有 NA 行的元素之外,您是否总是有长度相同的非 NA 元素?
  • @MekkiMacAulay 这是因为平衡,我将在编辑中更详细地解释这一点。 @akrun 是的,非 NA 元素的长度总是一样的,虽然我事先不知道,这就是我添加 n &lt;- max(sapply(cond, length)) 位的原因。
  • 您是否要求 NA 行保持完整?
  • @Brandon,是的,只有 NA 的行也应该在新数据框中表示为只有 NA 的行。

标签: r dataframe qualtrics


【解决方案1】:

如果非 NA 的长度在未完全用 NA 填充的行中始终相同,您可以尝试此操作:

首先,创建一个具有适当(转置)维度的数据框,并用 NA 填充它。

d2 <- data.frame(
        matrix(nrow = max(apply(d, 1, function(ii) sum(!is.na(ii)))),
               ncol=nrow(d)))

然后,使用apply 填充该数据框,然后将其转置以获得您想要的结果:

d2[] <- apply(d, 1, function(ii) ii[!is.na(ii)])
t(d2)
#   [,1] [,2] [,3]
#X1    1    2    3
#X2    3    2    1
#X3   NA   NA   NA
#X4   NA   NA   NA
#X5    1    2    3

【讨论】:

    猜你喜欢
    • 2017-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-24
    • 2020-10-01
    • 2017-05-02
    • 2016-08-26
    • 1970-01-01
    相关资源
    最近更新 更多