Допустим, у меня есть кадр данных, как это:Группировка/перекодирования факторы в том же data.frame
df <- data.frame(a=letters[1:26],1:26)
И я хотел бы, чтобы «повторно» фактор а, б и в, как «а».
Как это сделать?
Допустим, у меня есть кадр данных, как это:Группировка/перекодирования факторы в том же data.frame
df <- data.frame(a=letters[1:26],1:26)
И я хотел бы, чтобы «повторно» фактор а, б и в, как «а».
Как это сделать?
Кто-нибудь пробовал использовать этот простой метод? Это не требует специальных пакетов, просто понимание того, как R влияет на факторы.
Допустим, вы хотите переименовать уровни в фактор, получить их индексы
data <- data.frame(a=letters[1:26],1:26)
lalpha <- levels(data$a)
В этом примере мы представим себе, мы хотим знать индекс для уровня «е» и «ж»
lalpha <- levels(data$a)
ind <- c(which(lalpha == 'e'), which(lalpha == 'w'))
Теперь мы можем использовать этот индекс, чтобы заменить уровни фактора «а»
levels(data$a)[ind] <- 'X'
Если вы теперь посмотрите на д ataframe фактор a
будет там, где был e
и w
Я оставляю его вам, чтобы попробовать результат.
Одним из вариантов является recode()
функция в пакете car
:
require(car)
df <- data.frame(a=letters[1:26],1:26)
df2 <- within(df, a <- recode(a, 'c("a","b","c")="a"'))
> head(df2)
a X1.26
1 a 1
2 a 2
3 a 3
4 d 4
5 e 5
6 f 6
Пример, где a
не так просто, и мы перекодировать несколько уровней в один.
set.seed(123)
df3 <- data.frame(a = sample(letters[1:5], 100, replace = TRUE),
b = 1:100)
with(df3, head(a))
with(df3, table(a))
последние строки, дающие:
> with(df3, head(a))
[1] b d c e e a
Levels: a b c d e
> with(df3, table(a))
a
a b c d e
19 20 21 22 18
Теперь позволяет объединить уровни a
и e
на уровень Z
используя recode()
df4 <- within(df3, a <- recode(a, 'c("a","e")="Z"'))
with(df4, head(a))
with(df4, table(a))
, который дает:
> with(df4, head(a))
[1] b d c Z Z Z
Levels: b c d Z
> with(df4, table(a))
a
b c d Z
20 21 22 37
Делая это, не изложив уровни сливаться:
## Select the levels you want (here 'a' and 'e')
lev.want <- with(df3, levels(a)[c(1,5)])
## now paste together
lev.want <- paste(lev.want, collapse = "','")
## then bolt on the extra bit
codes <- paste("c('", lev.want, "')='Z'", sep = "")
## then use within recode()
df5 <- within(df3, a <- recode(a, codes))
with(df5, table(a))
Который дает нам так же, как df4
выше:
> with(df5, table(a))
a
b c d Z
20 21 22 37
Вы могли бы сделать что-то вроде:
df$a[df$a %in% c("a","b","c")] <- "a"
ОБНОВЛЕНИЕ: Более сложные факторы.
Data <- data.frame(a=sample(c("Less than $50,000","$50,000-$99,999",
"$100,000-$249,999", "$250,000-$500,000"),20,TRUE),n=1:20)
rows <- Data$a %in% c("$50,000-$99,999", "$100,000-$249,999")
Data$a[rows] <- "$250,000-$500,000"
Это хорошо работает для примера, который я предоставил, но он ломается, как только я пытаюсь использовать более сложные имена факторов –
@Brandon не могли бы вы привести пример «более сложных имен факторов»? –
«Менее 50 000 долларов», «50 000 - 99 999 долларов», «100 000 - 249 999 долларов», «250 000 - 500 000 долларов США» –
есть два пути. Если вы не хотите отказаться от неиспользуемых уровней, то есть «b» и «c», решение Joshua, вероятно, лучше всего.
если вы хотите отказаться от неиспользуемых уровней, а затем
df$a<-factor(ifelse(df$a%in%c("a","b","c"),"a",as.character(df$a)))
или
levels(df$a)<-ifelse(levels(df$a)%in%c("a","b","c"),"a",levels(df$a))
Это упрощенная версия выбранного ответа:
Я обнаружил, что самый простой способ справиться с этим просто перезаписать уровни фактора, глядя на них, а затем писать цифры вниз, чтобы быть перезаписаны ,
df <- data.frame(a=letters[1:26],1:26)
levels(df)
> [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o"
"p" "q" "r" "s" "t" "u" "v" "w" "x" "y" "z"
levels(df$a)[c(1,2)] <- "c"
summary(df$a)
> c d e f g h i j k l m n o p q r s t u v w x y z
3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
Нужно ли быть приказанным фактором, чтобы иметь возможность использовать это? –
@Brandon: нет, и в приведенном выше примере он не был упорядочен с точки зрения 'with (df, is.ordered (a))'. Я добавлю еще один пример, показывающий, что 'a' не так прост, как ваш оригинал. –
Я имел в виду в правильном порядке, а не приказал. Ты прав. –