2016-01-22 69 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

完成!感谢那! –