我一直在嘗試解決這個問題,但無論我嘗試什么都無法成功,在互聯網上找到的解決方案和這個網站也不起作用。
我有超過 500k 行的這類資料集。

示例子集:
subset= as.data.frame(matrix(c(9,9,9,0,2,9,0,9,9,1,0,2,9,9,9,0,0,0,2,2,2,1,1,1),ncol = 3, byrow = T))
每一列都是一個個體,每一行都是一個特定的標記,“0,1,2”表示該行沒有丟失資料(當然還有其他含義但這里不必解釋),“9”表示它是該行缺少資料。我將用引號寫數字以保持清晰,但它在資料集中是數字。
我想要做的是計算至少有一個樣本沒有丟失的行。因此,在全部由“9”組成的行中,計數器不會增加。如果該行中至少有一個單元格不是 9,則計數器將加一。
嘗試了一段時間后,我寫了這段代碼:
counter=0
test = apply(subset, 1, function(i) {
if(length(which(subset[i,] !=9)) != 0){
counter=counter 1
}
print(counter)
assign("counter",counter,envir = .GlobalEnv)
})
當我這樣做時,當唯一不是“9”的單元格/或單元格是整數(0)時,計數器不會增加。例如,在我上傳的圖片中,第 9 行
由許多“9”和一個整數(0)組成。這一行的計數器不會增加,但我也必須數一數。
為了克服這個問題,我嘗試了不同的方法,包括;
1-在回圈中的各個地方放置identical(length(which(dummy[i,] ==0)), integer(0)),all()函式,并嘗試了各種if else陳述句。我還嘗試了各種我不記得的方法,試圖計算整數(0)。
2- 將 9 更改為 NA / 將 integer(0) 更改為另一個數字,例如 3。這些都改變了回圈的機制,現在無論行中的單元格如何,計數器都會增加一。
3-使用if條件 with ( condition < 9*ncol(subset) ),我認為這會給出結果(如果其中任何一個沒有丟失/9,它將小于 9*ncol),但 R 再次將其視為整數(0)并且沒有任何變化。
4- 試圖找到結果為“零”的位置是行不通的,因為我在開頭撰寫的代碼也為丟失的資料“9”(零)給出了相同的結果。我只希望柜臺中缺少的結果。
如果有人可以就這個問題提供幫助,我們將不勝感激。由于 stackoverflow 想要保持評論部分的感謝資訊干凈,我想提前對大家說聲謝謝。
uj5u.com熱心網友回復:
據我了解,您想計算至少有一個與 9 不同的值的行數。有很多方法可以做到這一點,下面有兩種選擇。
使用 dplyr
你可以這樣做dplyr:
library(dplyr)
# Your provided data
subset %>%
filter(if_any(everything(), ~ .x != 9)) %>%
nrow()
#> [1] 6
由reprex 包于 2022-05-29 創建(v2.0.1)
在中filter(if_any(everything(), ~ .x != 9)),filter()洗掉至少一個值不等于 9 的行。之后,我們只計算行數。
和apply()
如果您想使用 apply ,您可以執行以下操作:
sum(
apply(
subset,
MARGIN = 1,
function(x) {
any(x != 9)
}
)
)
#> [1] 6
由reprex 包于 2022-05-29 創建(v2.0.1)
在這里,我遍歷subsetwith的每一行apply()并檢查該行的任何值是否不等于 9。這將回傳TRUE/的向量FALSE。我們sum()用這個向量來找到至少一個值不等于 9 的總行數。
uj5u.com熱心網友回復:
這是我覺得最容易理解的選項。counter您可以根據其他變數創建具有值的附加列。該case_when函式檢查列的值,如果找到 9,則將 0 放入counter列中。如果它在您的任何列中都找不到 9,則回傳 1。然后您可以對counter列求和以檢查沒有 9 的總行數。
library(dplyr)
subset <- as.data.frame(matrix(c(9, 9, 9, 0, 2, 9, 0, 9, 9, 1, 0, 2, 9, 9, 9, 0, 0, 0, 2, 2, 2, 1, 1, 1), ncol = 3, byrow = T))
subset <- subset %>%
mutate(counter = case_when(
V1 == 9 ~ 0,
V2 == 9 ~ 0,
V3 == 9 ~ 0,
TRUE ~ 1
))
number_of_full_rows <- sum(subset$counter)
如果您確定您了解基本版本,則可以縮短它,這樣您就不必為所有列命名。
library(dplyr)
subset <- as.data.frame(matrix(c(9, 9, 9, 0, 2, 9, 0, 9, 9, 1, 0, 2, 9, 9, 9, 0, 0, 0, 2, 2, 2, 1, 1, 1), ncol = 3, byrow = T))
subset <- subset %>%
mutate(counter = case_when(
if_any(.fns = ~ .x == 9) ~ 0,
TRUE ~ 1
))
number_of_full_rows <- sum(subset$counter)
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/482181.html
