2016-10-01 4 views
2

Я хочу выбрать половину данных данных, указанных в одном из столбцов. Другими словами, из dataframe приведенных ниже I нужно извлечь половину строк заданных значений в столбце Y:Выберите половину значений данных, указанных в одном столбце

DF: 
id1 column Y value 
9830  A   6 
7609  A   0 
9925  B   0 
9922  B   5 
9916  B   6 
9917  B   8 
9914  C   2 
9914  C   7 
9914  C   7 
9914  C   2 
9914  C   9 

Новый кадр данных должен выглядеть следующим образом:

NEW DF: 
    id1 column Y value 
    9830  A   6 
    9925  B   0 
    9922  B   5 
    9914  C   2 
    9914  C   7 

Кроме того, было бы полезно знать решение для выбора случайной половины всех строк datefram DF, указанной в столбце Y (например, не выбирать первые 50%).

Любая помощь приветствуется. Спасибо!

ответ

4

Предполагая, что вы хотите, первую половину каждой группы строк с одинаковым значением для column Y, где для нечетного числа строк мы округляем вниз, мы можем использовать filter из dplyr:

library(dplyr) 
df %>% group_by(`column Y`) %>% filter(row_number() <= floor(n()/2)) 
##Source: local data frame [5 x 3] 
##Groups: column Y [3] 
## 
## id1 column Y laclen 
## <int> <fctr> <int> 
##1 9830  A  6 
##2 9925  B  0 
##3 9922  B  5 
##4 9914  C  2 
##5 9914  C  7 

Мы первый group_bycolumn Y (обратите внимание на обратные кавычки, поскольку имя столбца содержит пробел), а затем используйте filter, чтобы сохранить только строки, для которых row_number меньше или равно общему количеству строк, заданных n() для группы, деленной на 2 (и округленная с floor).


Чтобы выбрать случайный 50% строк в каждой группе, используйте sample для генерации номера строк, чтобы сохранить и %in%, чтобы соответствовать тем, чтобы:

set.seed(123) 
result <- df %>% group_by(`column Y`) %>% filter(row_number() %in% sample(seq_len(n()),floor(n()/2))) 
##Source: local data frame [5 x 3] 
##Groups: column Y [3] 
## 
## id1 column Y laclen 
## <int> <fctr> <int> 
##1 9830  A  6 
##2 9922  B  5 
##3 9917  B  8 
##4 9914  C  2 
##5 9914  C  9 
+0

Удивительно, спасибо! И знаете, как выбрать случайные 50% строк и не только первые 50%? – Makaroni

+1

@ Макарони: см. Мое редактирование. – aichao

 Смежные вопросы

  • Нет связанных вопросов^_^