2016-01-22 70 views
2

我有一個數據幀,它有兩列a和b,定義組和b是每個組的重複值。爲了說明的目的,我添加了行號。從數據幀中選擇「中間」行,總行數爲偶數

> row.number <- c(1:7) 
> a <- c(rep("A", 3), rep("B", 4)) 
> b <- c(rep(250,3), rep(80,4)) 
> df <-data.frame(row.number,a,b) 
> df 
    row.number a b 
1   1 A 250 
2   2 A 250 
3   3 A 250 
4   4 B 80 
5   5 B 80 
6   6 B 80 
7   7 B 80 

現在,我想刪除重複的行,只保留「中間」行。對於總行數不均勻的團隊來說,這當然很簡單,但對於總行數甚至不那麼直接,在那裏顯然沒有「中間」行。在這裏,我想保留上面一行,這是靠近「中間」的結果應該是這樣的:

> row.number <- c(2,5) 
> a <- c("A","B") 
> b <- c(250,80) 
> df_solution <- data.frame(row.number,a,b) 
> df_solution 
    row.number a b 
1   2 A 250 
2   5 B 80 

我試圖寫一個ifelse功能,其中i)偶/參差不齊總的行數字進行評估(nrow %% 2 == 0),ii)如果甚至那麼保留「中間」以上的行,iii)如果不均勻,則保留中間行。

以這個post爲起點,我嘗試了各種解決方案,但是我無法編碼任何對步驟ii)有意義的東西,即對於偶數行號定義中間的上部相鄰行。

幫助將不勝感激!

+0

爲什麼列#_The 「中間」 row_在'B'? –

+0

我假設你的意思是第5行?我的想法很簡單,B總共有4行,因此在這種情況下,「中間」在第5行和第6行之間。我總是想選擇上排相鄰的行,所以在這種情況下排第5行。 –

+0

對於錯字,您是對的,感謝您的回答。重要的是非常具體:) –

回答

0

我們可以嘗試

# install.packages("data.table", dependencies = TRUE) 
library(data.table) 
setDT(df)[, if(.N >1) .SD[ceiling(.N/2)] else .SD ,a] 
# a row.number b 
#1: A   2 250 
#2: B   5 80 
+1

完成!感謝那! –