2017-03-15 416 views
0

我想從數據框中移除負值,然後我需要分別計算每行的平均值(每行的正值的平均值) 我寫了這個刪除負值但它不起作用。我有一個類似的警告是:如何從數據框中刪除負值R

錯誤[<-.data.frame*tmp*,I,J,值= NULL): 更換具有長度爲零

我怎樣才能解決這個問題呢?

for (i in 1:1000) { 
    for(j in 1:20){ 
    if (dframe[i,j]<=0) dframe[i,j]<-NULL 
    j=j+1 
    } 
    i=i+1 
} 
+4

data.frames中不能有NULL值。你可以將它們設置爲「NA」,這是「丟失」,然後你可以使用'rowSums(...,na.rm = T)'來忽略NA值 – MrFlick

+0

謝謝@MrFlick – cocomat

回答

2

我想補充一點,沒有必要寫一個for循環,你可以設置:

dframe[dframe < 0] <- NA 

由於dframe < 0給出的邏輯指標TRUE其中DFRAME小於零,可用於索引dframe並用NA代替TRUE值。

@MrFlick說明使用NA的而不是NULL,以及如何計算各行的裝置,當忽略NA值:

rowMeans(dframe, na.rm=TRUE) 

編輯,以回答問題重新:產生的NaN rowMeans以及如何刪除:

NA是「不可用」且是缺失值指示符,而NaN是「不是數字」,當算術運算的結果不能用數字定義時可以產生NaN。 0/0。我看不到您的dframe值,但是我猜想這是在所有行值爲NA時設置na.rm = TRUE時採用行的結果。查看平均值(c(NA,NA,NA),na.rm = TRUE)與平均值(c(NA,NA,NA),na.rm = FALSE)之間的差異。您可以離開NaN或決定如何在所有行值爲負值並且已由NA取代時定義行方式。

只考慮非NaN值,你可以子集不NaN的使用!is.nan,看下面的例子:

mea <- c(2, 4, NaN, 6) 
mea 
# [1] 2 4 NaN 6 
!is.nan(mea) # not NaN, output logical 
# [1] TRUE TRUE FALSE TRUE 
mea <- mea[!is.nan(mea)] 
# [1] 2 4 6 

或者你也可以通過設置mea[is.nan(mea)] <- ??

+1

我認爲你們都是' rowMeans',而不是'rowSums'。 – neilfws

+0

Ha!是的,謝謝你的發現,編輯答案 – Djork

+0

非常感謝。我寫過:dframe [dframe <0] < - NA > mea <-rowMeans(dframe,na .rm = TRUE),但是mea中有NaN值,我怎樣才能刪除它們?NaN是什麼意思?是否相同NA? – cocomat

0

的替代NaN的一些期望的值中,更簡單的方法來刪除所有與您的數據幀的負值的行將是:

df <- df[df > 0] 

這樣任何行與負價值將停止在您的數據框中。