Как складывать переменные фактора (символьные значения-aphla_numeric) со многими уровнями в r - PullRequest
0 голосов
/ 14 сентября 2018

Надеюсь, моя проблема не была ясна. Я подробно расскажу. В моем наборе данных csss, имеющем размерность (12782,60), одна из переменных «csa» (с которой мне интересно иметь дело) содержит 610 уровней (категорий / факторов). некоторые уровни содержат 1-10 наблюдений (ряды), а некоторые содержат 800-900 наблюдений.

выборки уровня (которые являются aplha-numeric ("SFRROC916", "SANGEO512", "SFRPAL650", "HARSPR413")).

Моя задача состоит в том, чтобы снизить уровни (факторы) с 610 до 5 на основе количества наблюдений (строк), которые содержит каждый уровень.

Если количество наблюдений (без рядов): 1-25 (наблюдения) = "A" -уровень, 26-60 = "B" -уровень, 61-99 = "C" -уровень, 100-152 = «D» -уровень,> 152- «E» -уровень.

Мой код

csss$csa<-as.character(csss$csa)
for(i in csss$csa)
{
a1<-nrow(csss[csss$csa==i,])
csss$csa<-ifelse(a1<=25, "A",
                ifelse((a1>=26 & a1<=60), "B",
                       ifelse((a1>=61 & a1<=99), "C",
                             ifelse((a1>=100 & a1<=152), "D", "E"))))
}

Я в конечном итоге имею только один уровень с вышеуказанным кодом. Помоги мне решить. Спасибо.

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

Мы можем сделать это в base R с

n1 <- sum(csss$csa %in% z)
csss$new.csa <- c("A", "B")[(n1 <=200) + 1]

, если условие основано на levels на 'csa'

n1 <- sum(levels(csss$csa) %in% z)

Если этоосновано на количестве наблюдений на каждую группу, опция base R будет

nm1 <- names(which(table(csss$csa) > 200))
df1$new.csa <- c("B", "A")[(csss$csa %in% nm1) + 1] 

Обновление

На основании обновления в посте ОП, это можно сделать с помощью cut или findInterval

tbl <- table(csss$csa)
nm1 <- as.character(cut(tbl, breaks = c(-Inf, 25, 60, 99, 152, Inf), 
           labels = LETTERS[1:5]))
csss$new.csa <- setNames(nm1, names(tbl))[csss$csa]

данные

set.seed(24)
csss <- data.frame(csa = sample(c("SFRROC916","SANGEO512","SFRPAL650","HARSPR413", 
   "HARSPR412", 
       "SFROC197", "SANGEO514", "SGFG0984", "SAND942"), 
 1000, replace = TRUE, prob = c(0.02, 0.1, 0.1, 0.1, 0.2, 0.2, 0.2, 
     0.4, 0.4)), col2 = rnorm(1000), stringsAsFactors = FALSE)
0 голосов
/ 14 сентября 2018

Выражение x <- nrow(...) возвращает скаляр (количество строк вашего подмножества фрейма данных). Тогда ifelse(x > 200, 'A', 'B') также вернет скаляр, поэтому все записи в столбце csa будут заменены на это число. Я предполагаю, что вы хотите сделать следующее: Заменить csa, чтобы вместо 610 возможных значений он содержал только два, A или B, в зависимости от количества наблюдений каждого исходного значения («А», когда Есть более 200 наблюдений). Это правильно?

Попробуйте

library(dplyr) 
new.csss <- csss %>% 
    group_by(csa) %>%
    mutate(new.csa = if_else(n() > 200, 'A', 'B'))

Столбец new.csa будет либо 'A', либо 'B' в зависимости от количества строк с соответствующим значением csa.

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