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)
}
}
什么是正确的方法?
答案 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;