将table()函数实现为用户定义的函数

时间:2016-06-03 16:06:53

标签: r

x <- c(1,2,3,2,1)

table(x)
# x
# 1 2 3 
# 2 2 1

输出每个元素在向量中出现的次数。

我正在尝试使用function()

模仿上述功能

以下是我的代码:

TotalTimes = function(x){
  times = 0
  y = unique(x)
  for (i in 1:length(y)) {
    for (i in 1:length(x)) {
      if(y[i] == x[i])
      times = times + 1
    }
    return(times)
  }
}

什么是正确的方法?

3 个答案:

答案 0 :(得分:5)

这是一个单行,使用rle()

f <- function(x) {
    with(rle(sort(x)), setNames(lengths, values))
}

f(c(1,2,3,2,1))
# 1 2 3 
# 2 2 1 

或者,这里的选项不那么简单&#34;并且可能是学习以R-ish方式编码的更好模型:

f2 <- function(x) {
    ss <- sort(x)
    uu <- unique(ss)
    names(uu) <- uu
    sapply(uu, function(u) sum(ss == u))
}

f2(c(1,2,3,2,1))
# 1 2 3 
# 2 2 1 

答案 1 :(得分:3)

function(x) {
   q = sapply(unique(x), function(i) sum(x == i))
   names(q) = unique(x)
   return(q)
}

答案 2 :(得分:2)

这是使用基数R的一种方法:

# data
x <- c(1,2,3,2,1)

# set up
y <- sort(unique(x))
counts <- rep_len(0, length.out=length(y))
names(counts) <- y

for(i in seq_along(x)) {
  counts[x[i] == y] <- counts[x[i] == y] + 1
}

将其包装在一个函数中:

table2 <- function(x) {
  # transform x into character vector to reduce search cost in loop
  x <- as.character(x)
  y <- sort(unique(x))
  counts <- rep_len(0, length.out=length(y))
  names(counts) <- y

  for(i in seq_along(x)) {
    counts[x[i]] <- counts[x[i]] + 1L
  }
  return(counts)
}

当然,此版本只接受单个矢量。在@Frank的建议中,函数版本略有不同,可能更快,因为它将输入x转换为字符。潜在的加速是在counts[x[i]]中搜索计数中的名称(作为x [i]),而不是使用&#34; ==。&#34;