希望我的问题不清楚。我将详细介绍。在我的维度为(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"))))
}
我最终只能获得上述代码的一个层次。帮我解决。谢谢。
答案 0 :(得分:0)
表达式x <- nrow(...)
返回标量(子数据帧的行数)。然后ifelse(x > 200, 'A', 'B')
也将返回一个标量,因此csa
列中的所有条目都将替换为该数字。我猜想您要执行以下操作:替换csa
,以便根据每个原件的观察次数,代替610个可能的值而仅包含两个A
或B
值(当观察值超过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帖子中的更新,可以使用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)