簡體   English   中英

如何在數據框的所有列上運行 for 循環並將結果作為單獨的數據框或矩陣返回

[英]How do I run a for loop over all columns of a data frame and return the result as a separate data frame or matrix

我正在嘗試獲取df中每個變量的案例數。 df 中有 275 個案例,但大多數列都有一些缺失數據。 我正在嘗試運行一個 for 循環來獲取如下信息:

idef_id<-readxl::read_xlsx("IDEF.xlsx")

casenums <- for (i in names(idef_id)) {
  nas<- sum(is.na(i))
  275-nas
}

但是 casenums 的casenums

> summary(casenums)
Length  Class   Mode 
     0   NULL   NULL 

任何幫助將非常感激!

for循環不是 function - 它不返回任何內容,因此x <- for(...沒有任何意義。您可以使用例如sapply來做到這一點,就像這樣

casenums <- sapply(idef_id, function(x) sum(!is.na(x)))

或者您可以在 for 循環中執行此操作,但您需要在循環內分配一個特定值:

casenums = rep(NA, ncol(idef_id))
names(casenums) = names(idef_id)
for(i in names(idef_id)) {
  casenums[i] = sum(!is.na(idef_id[[i]]))`
}

您還遇到了i使用列名的問題,因此sum(is.na(i))詢問是否缺少列名的值。 您需要使用idef_id[[i]]來訪問實際列,而不僅僅是列名,如上所示。

您似乎希望答案是非 NA 值的數量,所以我切換到sum(.is.na(...))直接計算,而不是硬編碼數據幀的行數並做減法。

for循環的直接解決方法是您的i是列,而不是其中的數據。 在您第一次通過for循環時,您的i是 class character ,長度始終為 1,因此sum(is.na(i))將為 0。由於幀的結構,名稱的可能性很小是NA (盡管有可能......使用手動詭計)。

我建議對您的代碼進行文字修復可能是:

casenums <- for (i in names(idef_id)) {
  nas<- sum(is.na(idef_id[[i]]))
  275-nas
}

但這有一個額外的問題,即for循環不返回任何內容(正如 Gregor 的回答也討論的那樣)。 為了了解事情,我將保留它(對於第一個項目符號),然后修復它(在第二個項目符號中):

兩件事情:

  • 如果/當您的數據發生變化時,硬編碼275 (假設這是幀中的行數)將是有問題的。 即使您“有信心”,它也永遠不會……我仍然建議不要對其進行硬編碼。 如果它基於行數,那么也許

    OUT_OF <- 275 # should this be nrow(idef_id)? casenums <- for (i in names(idef_id)) { nas<- sum(is.na(idef_id[[i]])) OUT_OF - nas }

    至少在聲明的意義上,變量名稱(請選擇更好的名稱)清楚地表明您如何確定275以及將來應該如何(如有必要)修復它。

    (或者更好的是,如果您只需要計算 not- NA ,請使用 Gregor 的sum(.is.na(...))邏輯。)

  • 使用sapplylapply可以很容易地為框架的每一列做一些事情,也許

    OUT_OF <- 275 # should this be nrow(idef_id)? OUT_OF - sapply(idef_id, function(one_column) sum(is.na(one_column))) ## or sapply(idef_id, function(one_column) OUT_OF - sum(is.na(one_column)))

暫無
暫無

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

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