Как сгенерировать и упорядочить подмножество фрейма данных длиной в X элементов или меньше

#r #subset

#r #подмножество

Вопрос:

У меня большой фрейм данных (df). Я хотел бы создать df2 отсюда. df2 должен соответствовать этим критериям:

1) Подстановка по значению в одном из столбцов.

2) df2 должен иметь длину 20 элементов или меньше.

3) df2 должен быть упорядочен по возрастанию значения

Мои попытки:

 A <- floor(runif(100, min = 1, max = 100))
B <- floor(runif(100, min = 1, max = 100))
as.data.frame(cbind(A, B)) -> df

head(df[which(df$A < 50),], n = 20) -> df2
  

Это работает нормально, но я бы хотел, чтобы на выходе было 20 элементов или меньше.

 head(df[which(df$A < 50),], n < 20) -> df2  
  
 <=/=</< 
  

Все это приводит к тому, что ‘n’ не найдено.

 order(head(df[which(df$A < 20),], decreasing = False)) -> df2
  

Вроде работает, но создает список, а не фрейм данных. Также, когда я пытаюсь, мой вывод не увеличивается.

Любая помощь будет оценена.

Комментарии:

1. как вы выбрали 50 дюймов df$A < 50 ? это какое-либо произвольное число? и он должен быть упорядочен по какому столбцу?

2. Да, это произвольное число. Просто в качестве примера. Он может быть упорядочен по любому, скажем, по столбцу A для простоты.

Ответ №1:

Пытался сделать это в однострочном формате в базе R, но это становилось действительно уродливым, поэтому вот двухэтапное решение

 temp <- df[head(which(df$A < 50), 20), ]
temp[order(temp$A), ]

#    A  B
#4   4 24
#35  7 49
#13  9 16
#39 10 44
#1  12 41
#26 14  8
#14 15 11
#11 16 92
#31 17 17
#20 19 95
#2  20 78
#6  30 94
#16 33 66
#12 34 70
#25 35 21
#9  41 69
#15 41 28
#18 43 37
#5  48 58
#22 49 24
  

Однако с dplyr помощью вы можете сделать это за одну цепную операцию

 library(dplyr)
df %>%
  filter(A < 50) %>%
  slice(1:20) %>%
  arrange(A)
  

Вы можете изменить значения 50 и 20 в зависимости от ваших предпочтений.

данные

 set.seed(2345)
A <- floor(runif(100, min = 1, max = 100))
B <- floor(runif(100, min = 1, max = 100))
as.data.frame(cbind(A, B)) -> df