如何在r

时间:2018-09-14 16:02:33

标签: r

希望我的问题不清楚。我将详细介绍。在我的维度为(12782,60)的csss数据集中,变量之一是“ csa”(我有兴趣处理)包含610个级别(类别/因子)。其中一些级别包含1-10个观察(行),而某些级别包含800-900个观察。

水平样本(为全数字(“ 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 :(得分:0)

表达式x <- nrow(...)返回标量(子数据帧的行数)。然后ifelse(x > 200, 'A', 'B')也将返回一个标量,因此csa列中的所有条目都将替换为该数字。我猜想您要执行以下操作:替换csa,以便根据每个原件的观察次数,代替610个可能的值而仅包含两个AB值(当观察值超过200时为“ A”)。那正确吗?

尝试

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

new.csa将是'A''B',具体取决于具有相应值csa的行数。

答案 1 :(得分:0)

我们可以在base R中使用

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

如果条件基于'csa'上的levels

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] 

更新

基于OP帖子中的更新,可以使用cutfindInterval

完成
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)