2017-05-09 7 views
2

私はRにdtというデータテーブルを持っています。中n行を選択する

row.number <- c(1:20) 
a <- c(rep("A", 10), rep("B", 10)) 
b <- c(sample(c(0:100), 20, replace = TRUE)) 
df <-data.table(row.number,a,b) 
df 
    row.number a b 
1   1 A 14 
2   2 A 59 
3   3 A 39 
4   4 A 22 
5   5 A 75 
6   6 A 89 
7   7 A 11 
8   8 A 88 
9   9 A 22 
10   10 A 6 
11   11 B 37 
12   12 B 42 
13   13 B 39 
14   14 B 8 
15   15 B 74 
16   16 B 67 
17   17 B 18 
18   18 B 12 
19   19 B 56 
20   20 B 21 

列bの昇順にレコードを配置した後に、中央から「n」行(たとえば10)を取りたいとします。

+0

または 'df [b> = median(b)]'? – Cath

答えて

1

フィルタリングするためにソートし、.Nする用途setorder

setorder(df, b)[(.N/2 - 10/2):(.N/2 + 10/2 - 1), ] 
    row.number a b 
1:   11 B 36 
2:   5 A 38 
3:   8 A 41 
4:   18 B 43 
5:   1 A 50 
6:   12 B 51 
7:   15 B 54 
8:   3 A 55 
9:   20 B 59 
10:   4 A 60 
0

あなたは以下のコード

library(data.table) 

set.seed(9876) # for reproducibility 

# your data 
row.number <- c(1:20) 
a <- c(rep("A", 10), rep("B", 10)) 
b <- c(sample(c(0:100), 20, replace = TRUE)) 
df <- data.table(row.number,a,b) 
df 

# define how many to select and store in n 
n <- 10 
# calculate how many to cut off at start and end 
n_not <- (nrow(df) - n)/2 

# use data.tables setorder to arrange based on column b 
setorder(df, b) 

# select the rows wanted based on n 
df[ (n_not+1):(nr-n_not), ] 

を使用することができ、私はこれがあなたが望むものであるかどうかをお知らせください。

関連する問題