R 从数据框中筛选出非NA条目,同时只保留NA行

R 从数据框中筛选出非NA条目,同时只保留NA行,r,dataframe,qualtrics,R,Dataframe,Qualtrics,我正在寻找一种更有效的方法(就代码长度而言)将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 到 也就是说,我希望删除多余的NAs,但只使用NAs

我正在寻找一种更有效的方法(就代码长度而言)将
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

也就是说,我希望删除多余的NAs,但只使用NAs正确表示行

我编写了下面的函数来完成这项工作,但我确信有一种不太冗长的方法来实现同样的功能

#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)
#虚拟数据帧

数据如果非NAs的长度在未完全填充NA的行中始终相同,则可以尝试此方法:

首先,创建具有适当(转置)维度的数据帧,并用NAs填充它

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

如果非NAs的长度在未完全填充NA的行中始终相同,则可以尝试此方法:

首先,创建具有适当(转置)维度的数据帧,并用NAs填充它

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

您能解释一下为什么您的数据当前使用不同的变量(列)来处理要折叠为相同变量的数据吗?除了包含所有NA行的元素外,您是否总是有长度相同的非NA元素?@MekkiMacAulay这是因为平衡,我将在编辑中对此进行更详细的解释@akrun是的,非NA元素的长度总是相同的,尽管我事先不知道,这就是为什么我添加了
n您是否要求NA行保持完整?@Brandon,是的,在新的数据框中,只有NA的行也应该表示为只有NA的行。您能解释一下为什么您的数据当前使用不同的变量吗(专栏)对于要折叠到相同变量中的数据?除了具有所有NA行的元素外,是否总是有长度相同的非NA元素?@MekkiMacAulay这是因为平衡,我将在编辑中对此进行更详细的解释。@akrun是的,非NA元素的长度总是相同的,尽管我事先不知道,这是y我添加了
n您是否要求NA行保持完整?@Brandon,是的,在新数据框中,只有NA的行也应表示为只有NA的行。
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