Как вы устанавливаете подкадр данных в 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)), ]
Другие вопросы по тегам