удалить факторы с критериями - PullRequest
2 голосов
/ 06 ноября 2011

Я имею дело с данными KDD 2010 https://pslcdatashop.web.cmu.edu/KDDCup/downloads.jsp В R, как я могу удалить строки с коэффициентом, который имеет небольшое общее количество экземпляров.

Я пробовал следующее: создать таблицу для фактора имени студента

studenttable <- table(data$Anon.Student.Id)

возвращает таблицу

l5eh0S53tB Qwq8d0du28 tyU2s0MBzm dvG32rxRzQ i8f2gg51r5 XL0eQIoG72 
  9890       7989       7665       7242       6928       6651 

, тогда я могу получить таблицу, которая сообщает мне, есть ли более 1000 точек данных для данногоуровень фактора

biginstances <- studenttable>1000

затем я попытался создать подмножество данных в этом запросе

bigdata <- subset(data, (biginstances[Anon.Student.Id]))

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

Ответы [ 4 ]

5 голосов
/ 06 ноября 2011

Возможно, есть более эффективные способы сделать это, но это должно дать вам то, что вы хотите.Я не использовал имена, которые вы использовали, но вы должны быть в состоянии следовать логике очень хорошо (надеюсь!)

# Create some fake data
dat <- data.frame(id = rep(letters[1:5], 1:5), y = rnorm(15))
# tabulate the id variable
tab <- table(dat$id)
# Get the names of the ids that we care about.
# In this case the ids that occur >= 3 times
idx <- names(tab)[tab >=3]
# Only look at the data that we care about
dat[dat$id %in% idx,]
4 голосов
/ 06 ноября 2011

@ Дейсон дал вам хороший код для работы в качестве отправной точки. Я попытаюсь объяснить, почему (я думаю) то, что вы пытались, не сработало.

biginstances <- studenttable>1000

Это создаст логический вектор, длина которого равна числу уникальных идентификаторов учеников. studenttable содержит количество для каждого уникального значения data$Anon.Student.Id. При попытке использовать этот логический вектор в subset:

bigdata <- subset(data, (biginstances[Anon.Student.Id]))

его длина почти наверняка намного меньше, чем количество строк в data. А поскольку критерий поднабора в subset предназначен для идентификации строк data, правила рециркуляции R вступают во владение, и вы получаете «странные» подмножества.

Я бы также добавил, что использование подмножеств для удаления уровней редких факторов не изменит атрибута уровней фактора . Другими словами, вы получите коэффициент обратно без экземпляров этого уровня, но все исходные уровни факторов останутся в атрибуте уровней. Например:

> fac <- factor(rep(letters[1:3],each = 3))
> fac
[1] a a a b b b c c c
Levels: a b c
> fac[-(1:3)]
[1] b b b c c c
Levels: a b c
> droplevels(fac[-(1:3)])
[1] b b b c c c
Levels: b c

Таким образом, вы захотите использовать droplevels, если хотите убедиться, что эти уровни действительно «ушли». Также см. options(stringsAsFactors = FALSE).

0 голосов
/ 07 ноября 2011

Вот как мне удалось это сделать.Я отсортировал таблицу факторов и связанных с ними количеств.

studenttable <- sort(studenttable, decreasing=TRUE)

теперь, когда все в порядке, чтобы мы могли разумно использовать диапазоны столбцов.Итак, я получил число факторов, которые представлены более 1000 раз в данных.

sum(studenttable>1000)
230
sum(studenttable<1000)
344
344+230=574

Теперь мы знаем, что первые 230 уровней факторов - это те, которые нас интересуют.Таким образом, мы можем сделать

idx <- names(studenttable[1:230])
bigdata <- data[data$Anon.Student.Id %in% idx,]

, чтобы убедиться, что он работает, выполнив команду

bigstudenttable <- table(bigdata$Anon.Student.Id)

, чтобы получить распечатку и увидеть, что все уровни факторов с менее чем 1000 экземпляров теперь равны 0.

0 голосов
/ 06 ноября 2011

Другой подход будет включать соединение между вашим набором данных и таблицей интересов.Я буду использовать plyr для своих целей, но это можно сделать с помощью базовой функции (например, merge и as.data.frame.table)

require(plyr)

set.seed(123)
Data <- data.frame(var1 = sample(LETTERS[1:5], size = 100, replace = TRUE),
                   var2 = 1:100)


R> table(Data$var1)

 A  B  C  D  E 
19 20 21 22 18 


## rows with category less than 20

mytable <- count(Data, vars = "var1")

## mytable <- as.data.frame(table(Data$var1))

R> str(mytable)
'data.frame':   5 obs. of  2 variables:
 $ var1: Factor w/ 5 levels "A","B","C","D",..: 1 2 3 4 5
 $ freq: int  19 20 21 22 18

Data <- join(Data, mytable)

## Data <- merge(Data, mytable)

R> str(Data)
'data.frame':   100 obs. of  3 variables:
 $ var1: Factor w/ 5 levels "A","B","C","D",..: 3 2 3 5 3 5 5 4 3 1 ...
 $ var2: int  1 2 3 4 5 6 7 8 9 10 ...
 $ freq: int  21 20 21 18 21 18 18 22 21 19 ...



mysubset <- droplevels(subset(Data, freq > 20))

R> table(mysubset$var1)

 C  D 
21 22 

Надеюсь, это поможет ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...