簡體   English   中英

從數據幀中篩選出非NA條目,同時保留僅包含NA的行

[英]sieve out non-NA entries from data frame while retaining rows with only NA

我正在尋找一種更有效的方法(就代碼的長度而言)從以下方式轉換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)

我的問題類似於關於提取參與者分配條件的問題 (我收到了很好的答案)。 我嘗試將這些答案擴展到當前的虛擬數據,但到目前為止沒有成功。 因此,我的冗長的自定義函數。


編輯:有關為什么我問這個問題的其他信息:第一個數據幀表示實驗的原始輸出,在該實驗中,我將參與者分配給了三個條件之一(此處為簡單起見使用3)。 在每種情況下,參與者閱讀不同的場景,然后回答有關他們已閱讀的場景的同一組問題。 Qualtrics在V1V3列中記錄了第一種情況的參與者的答案,在V4V6列中記錄了第二種條件的參與者的答案,在V7V9列中記錄了第三種情形的參與者的答案。 (如果該問題塊包含4個問題,則第一列條件下參與者的答案將在V1V4列中,第二條件下參與者的答案將在V2V8中……)。


如果非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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM