![](/img/trans.png)
[英]How to loop a function over all elements of a vector except one and store the result in separate columns of a data frame
[英]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(...))
邏輯。)
使用sapply
或lapply
可以很容易地為框架的每一列做一些事情,也許
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.