#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