Рассмотрим base
R, также без разделения или сопоставления с использованием transform
, merge
и subset
. В частности, объединить в отдельный фрейм данных для нижнего / верхнего диапазона назначений для последующей фильтрации. Но для выборки специальной группы 2 необходим требуемый объект grp2_sample с использованием row.names
:
grp2_sample <- sample(rownames(bike_sales[bike_sales$group == 2,]), 5) # SAMPLE OF 5
sub_df <- subset(merge(transform(bike_sales, rn = row.names(bike_sales)),
data.frame(group = c(1,3,4),
lower = c(-Inf, 3000, 7000),
upper = c(1500, 5000, Inf)),
by ="group", all.x=TRUE),
(price >= lower & price <= upper) | (rn %in% grp2_sample)
)
В качестве альтернативы с dplyr
с использованием аналога mutate
left_join
и filter
:
library(dplyr)
...
grp2_sample <- sample(rownames(bike_sales[bike_sales$group == 2,]), 5) # SAMPLE OF 5
sub_df2 <- bike_sales %>%
mutate(rn = row.names(bike_sales)) %>%
left_join(data.frame(group = c(1,3,4),
lower = c(-Inf, 3000, 7000),
upper = c(1500, 5000, Inf)),
by="group") %>%
filter((price >= lower & price <= upper) | (rn %in% grp2_sample))
И даже data.table
альтернативное решение:
library(data.table)
...
grp2_sample <- sample(rownames(bike_sales[bike_sales$pick == 2,]), 5) # SAMPLE OF 5
sub_dt <- setDT(bike_sales)[, rn := row.names(bike_sales)][
data.table(group = c(1,3,4),
lower = c(-Inf, 3000, 7000),
upper = c(1500, 5000, Inf)),
on="group",
`:=`(lower=i.lower, upper=i.upper)
][(price >= lower & price <= upper) | (rn %in% grp2_sample),]