2017-10-05 59 views
0

我在R上有一個數據框,並且我想要刪除那些在B列中沒有以連續方式增加的行我的意思是,每一行中的值必須高於前一個值,但低於下一個值。我不想根據列B對數據框進行排序,因爲我想保留A列中的順序。我想我可以用if語句來做到這一點,但是由於先進的原因,我沒有足夠的R經驗。當一列中的值不是以連續的方式增加時,如何從數據框中刪除行

我得到的是這個,我必須刪除星號值。

A  B 
26.00 11158115 
27.00 16722714* 
27.08 11881252 
90.25 69428973 
90.27 69749777 
93.30 64207240* 
95.90 71428751 
96.00 71670964 
107.65 100385980 
107.75 226164158* 
107.8 103280320 

我需要這樣的:

A  B 
26.00 11158115 
27.08 11881252 
90.25 69428973 
90.27 69749777 
95.90 71428751 
96.00 71670964 
107.65 100385980 
107.80 103280320 
+0

除非您對數據做出一些假設,否則這聽起來有點棘手。也許適合B〜A的曲線並在視覺上去除異常值。 –

+0

我不明白你的意思刪除離羣值「我有一種大數據框架,超過2000行,我必須爲其他數據框做這個,這就是爲什麼我試圖找到一個自動解決方案。此外,分佈的一些值是不是異常值,只是這些不符合高於先前值但低於下一個值的條件。 –

回答

0

我找不到更好的解決方案,但至少它的工作原理。

df = read.table(text = "A,B 
26.00,11158115 
27.00,16722714 
27.08,11881252 
90.25,69428973 
90.27,69749777 
93.30,64207240 
95.90,71428751 
96.00,71670964 
107.65,100385980 
107.75,226164158 
107.8,103280320", header = TRUE, sep = ",", stringsAsFactors = FALSE) 

r = 2 
repeat { 

    if ((df$B[r] < df$B[r-1] | df$B[r] > df$B[r+1]) & df$B[r-1] < df$B[r+1]) { 
     df <- df[-r,]  
    } else { 
     r = r + 1 
    } 

    if (r == nrow(df)) break 
} 

df 

輸出:

 A   B 
1 26.00 11158115 
3 27.08 11881252 
4 90.25 69428973 
5 90.27 69749777 
7 95.90 71428751 
8 96.00 71670964 
9 107.65 100385980 
11 107.80 103280320 

說明:

我們通過從所述第二元件中的數據幀的各行運行(第一個將總是有效的是第一個)。然後,我們用預期的標準刪除每一行:該值必須高於前一個值並低於下一個((B[r] < B[r-1] or B[r] > B[r+1]))。但是用這個標準,我們沒有得到預期的結果,因此我們也驗證後續值是(B[r-1] < df$B[r+1]

+0

它工作得更好,你能解釋你的代碼嗎?爲什麼r = 2?對不起,如果這是一個非常基本的問題,但我想了解解決方案。謝謝! –

+0

@IdaliaRojas,加一點解釋。問候。 –

0

這裏是一個解決方案排序,:

A <- c(26.00, 27.00, 27.08, 90.25, 90.27, 93.30, 95.90, 96.00, 107.65, 107.75, 107.8) 
B <- c(11158115, 16722714, 11881252, 69428973, 69749777, 64207240, 71428751, 71670964, 100385980, 
     226164158, 103280320) 
d <- data.frame(A, B) 
repeat { 
    delta <- diff(d$B) 
       # delta gives you the difference between successive values of B 
       # delta[1] corresponds to the difference between B[2] and B[1] 
    if(all(delta > 0)) { 
     break 
    } 
    iWrong <- 1 + which(delta < 0) 
       # '1 +' means that if the next value is not larger than the previous value 
       # (delta is not positive), we delete the next value 
       # you can remove '1+' and delete this value instead 
    d <- d[-iWrong,] 
} 

我說「之類的」,因爲它是目前還不清楚,我這行究竟應該是除去。爲什麼刪除第2行而不是第3行?我的解決方案都會給你帶來:

1 26.00 11158115 
2 27.00 16722714 
4 90.25 69428973 
5 90.27 69749777 
7 95.90 71428751 
8 96.00 71670964 
9 107.65 100385980 
10 107.75 226164158 
+0

謝謝你的回答,我試過這個,但是我仍然有不符合高於前一行但低於下一行的條件的值。刪除第二個值的原因,但不是第三行是我試圖編輯的數據幀是一個遺傳圖,我想根據它們的位置評估每一行,這是列A給出的。 –

+0

hmm ..你能舉一個例子,我的代碼不起作用嗎?請注意,在這個例子中B是非遞減的。您可以通過將'> ='更改爲'>'來使其嚴格增加。 –

+0

當我嘗試嚴格增加時,我有一些剛滿足兩個條件之一的值,並將其保存在表中,例如,星號值: 26/11158115 \t | 27/16722714 \t * | 27.5/12170863 | 27.73/12354762 | 90.25/69428973 | 90.27/69749777 | 94/64841576 \t * 95/65078005 \t * 95。71428751分之9| 96/71670964 \t | 97.7 \t/74918081 | 另外,你能解釋「1 +哪個」的功能,這對我來說是不清楚的。 –

相關問題