R - 如果向量中的n多于(或少于)n,则选择元素

时间:2014-12-22 08:08:13

标签: arrays r elements

我需要更改向量中元素的值。但我想只更改少于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

4 个答案:

答案 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