我需要更改向量中元素的值。但我想只更改少于n个实例的元素。
我使用了这个metodh,Data $ GENE是要更改的向量。
Data$GENE[which(Data$GENE %in% names(table(Data$GENE)[table(Data$GENE) < 10]))] <<- 'other'
这有点令人费解,是否有更多的方式?
更新:回答以下评论:实际上是一个非常简单的案例!
> vec <- c(rep('foo', 5), rep('foo1', 2), rep('foo2', 1), rep('foo3', 3), rep('bar', 6))
> table(vec)
vec
bar foo foo1 foo2 foo3
6 5 2 1 3
> vec[which(vec %in% names(table(vec)[table(vec) < 5]))] <- 'other'
> table(vec)
vec
bar foo other
6 5 6
答案 0 :(得分:5)
因素的汇总方法支持:
summary(factor(vec),maxsum=sum(table(vec)>=5)+1)
bar foo (Other)
6 5 6
答案 1 :(得分:3)
我只会分两步完成,所以它就像你说的那样复杂,你只需要计算一次表。此外,在您的方法中使用它时,您不需要which
。
y <- table(vec)
vec[vec %in% names(y[y < 5])] <- "other"
答案 2 :(得分:2)
您可以使用data.table轻松完成此操作。
library(data.table)
data(mtcars)
setDT(mtcars, keep.rownames = T) # set data.frame as data.table
# add a count column with .N, then chain with [count < ...]
mtcars[, count := .N, by = cyl][count < 14]
答案 3 :(得分:2)
我认为您所描述的内容可以通过基础R中的ave
完成。在这里,我们用少于三个观察结果替换这些观察结果。
vec[ave(seq_along(vec), vec, FUN=length) < 5] <- "other"
vec
我们可以将它包装在一个友好的函数中
haslessthan <- function(x, n) ave(seq_along(x), x, FUN=length) < n
vec[haslessthan(vec, 5)] <- "other"
无论哪种方式,结果都是
vec
bar foo other
6 5 6