Как вы устанавливаете подкадр данных в R на основе минимального размера выборки
Допустим, у вас есть фрейм данных с двумя уровнями факторов, который выглядит следующим образом:
Factor1 Factor2 Value
A 1 0.75
A 1 0.34
A 2 1.21
A 2 0.75
A 2 0.53
B 1 0.42
B 2 0.21
B 2 0.18
B 2 1.42
и т.п.
Как я subset
этот фрейм данных ("df", если хотите), основанный на условии, что комбинация Фактора1 и Фактора2 (Факт1* Факт2) имеет больше, чем, скажем, 2 наблюдения? Можете ли вы использовать length
аргумент в subset
сделать это?
3 ответа
Предполагая ваш data.frame
называется mydf
, ты можешь использовать ave
создать логический вектор, чтобы помочь подмножеству:
mydf[with(mydf, as.logical(ave(Factor1, Factor1, Factor2,
FUN = function(x) length(x) > 2))), ]
# Factor1 Factor2 Value
# 3 A 2 1.21
# 4 A 2 0.75
# 5 A 2 0.53
# 7 B 2 0.21
# 8 B 2 0.18
# 9 B 2 1.42
Вот ave
подсчитывать ваши комбинации. Заметить, что ave
возвращает объект той же длины, что и количество строк в вашем data.frame
(это делает его удобным для поднабора).
> with(mydf, ave(Factor1, Factor1, Factor2, FUN = length))
[1] "2" "2" "3" "3" "3" "1" "3" "3" "3"
Следующим шагом будет сравнение этой длины с вашим порогом. Для этого нам нужна анонимная функция для нашего FUN
аргумент.
> with(mydf, ave(Factor1, Factor1, Factor2, FUN = function(x) length(x) > 2))
[1] "FALSE" "FALSE" "TRUE" "TRUE" "TRUE" "FALSE" "TRUE" "TRUE" "TRUE"
Почти там... но так как первый элемент был символьным вектором, наш вывод также является символьным вектором. Мы хотим это as.logical
так что мы можем напрямую использовать его для поднабора.
ave
не работает с объектами класса factor
, в этом случае вам нужно будет сделать что-то вроде:
mydf[with(mydf, as.logical(ave(as.character(Factor1), Factor1, Factor2,
FUN = function(x) length(x) > 2))),]
library(data.table)
dt = data.table(your_df)
dt[, if(.N > 2) .SD, list(Factor1, Factor2)]
# Factor1 Factor2 Value
#1: A 2 1.21
#2: A 2 0.75
#3: A 2 0.53
#4: B 2 0.21
#5: B 2 0.18
#6: B 2 1.42
Ты можешь использовать interaction
а также table
чтобы увидеть количество наблюдений для каждого взаимодействия (mydata - ваши данные), а затем использовать %in%
подмножество данных.
mydata$inter<-with(mydata,interaction(Factor1,Factor2))
table(mydata$inter)
A.1 B.1 A.2 B.2
2 1 3 3
mydata[!mydata$inter %in% c("A.1","B.1"), ]
Factor1 Factor2 Value inter
3 A 2 1.21 A.2
4 A 2 0.75 A.2
5 A 2 0.53 A.2
7 B 2 0.21 B.2
8 B 2 0.18 B.2
9 B 2 1.42 B.2
Обновлено в соответствии с комментарием @Ananda: Вы можете использовать следующий однострочный код после создания переменной взаимодействия.
mydata[mydata$inter %in% names(which(table(mydata$inter) > 2)), ]