Удалите строки кадра данных, которые соответствуют уровню фактора (и затем выведите данные, исключая этот уровень фактора) - PullRequest
4 голосов
/ 18 августа 2010

У меня есть фрейм данных с 251 наблюдением и 45 переменными. В середине фрейма данных есть 6 наблюдений, которые я бы хотел исключить из моего анализа. Все 6 относятся к одному уровню фактора. Легко создать новый фрейм данных, который при распечатке, по-видимому, исключает 6 наблюдений. Однако когда я использую новый фрейм данных для построения графиков переменных по рассматриваемому фактору, предположительно исключенный уровень все еще включается в график (без наблюдений). Использование str () подтверждает, что уровень все еще присутствует в некоторой форме. Кроме того, индекс для нового фрейма данных пропускает 6 значений, в которых ранее находились наблюдения.

Как я могу создать новый фрейм данных, который исключает 6 наблюдений и не продолжает распознавать исключенный уровень фактора при построении графика? Можно ли сделать новый фрейм данных для «переиндексации», чтобы новый индекс не пропускал значения, ранее присвоенные исключенному уровню фактора?

Я привел пример с составленными данными:

# ---------------------------------------------
# data
char <- c( rep("anc", 4), rep("nam", 3), rep("oom", 5), rep("apt", 3) )
a <- 1:15 / pi
b <- seq(1, 8, .5)
d <- rep(c(3, 8, 5), 5)
dat <- data.frame(char, a, b, d)
dat

# two ways to remove rows that contain a string
datNew1 <- dat[-which(dat$char == "nam"), ]
datNew1
datNew2 <- dat[grep("nam", dat[ ,"char"], invert=TRUE), ]
datNew2

# plots still contain the factor level that was excluded
boxplot(datNew1$a ~ datNew1$char)
boxplot(datNew2$a ~ datNew2$char)

# str confirms that it's still there
str(datNew1)
str(datNew2)
# ---------------------------------------------

Ответы [ 3 ]

8 голосов
/ 18 августа 2010

Вы можете использовать функцию drop.levels() из пакета gdata , чтобы уменьшить уровни фактора до фактически используемых - примените ее к столбцу после создания нового data.frame. * 1005. *

Также попробуйте поискать здесь r и drop.levels (но вам нужно сделать поисковый термин [r] drop.levels, который я здесь не могу, поскольку он мешает логике форматирования).

1 голос
/ 12 февраля 2014

Начиная с версии R 2.12.0, существует функция droplevels, которую можно применять либо к столбцам фактора, либо ко всему кадру данных. При применении к фрейму данных он удаляет уровни с нулевым счетом из всех столбцов факторов. Так что ваш пример станет просто:

# two ways to remove rows that contain a string
datNew1 <- droplevels( dat[-which(dat$char == "nam"), ] )
datNew2 <- droplevels( dat[grep("nam", dat[ ,"char"], invert=TRUE), ] )
0 голосов
/ 16 июня 2011

Я вставил кое-что из своего кода - у меня есть эксперимент с вложением в озере - есть измерения из вложений и озера, но в основном я не хочу иметь дело с озером: моя переменная называется "t.level", а уровни контролируются, низкий средний высокий и код озера - этот код позволяет использовать nolk $ или data = nolk для получения данных без "озера" ..

nolk<-subset(mylakedata,t.level == "control" | 
                        t.level == "low" | 
                        t.level == "medium" | 
                        t.level=="high")

nolk[]<-lapply(nolk, function(t.level) if(is.factor(t.level)) 
                                         t.level[drop=T] 
                                       else t.level)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...