Zfu*_*unk 16 r unique count dataframe
我想返回表中每列的唯一值的计数.例如,如果我有表:
Testdata <- data.frame(var_1 = c("a","a","a"), var_2 = c("b","b","b"), var_3 = c("c","d","e"))
var_1 | var_2 | var_3
a | b | c
a | b | d
a | b | e
Run Code Online (Sandbox Code Playgroud)
我希望输出为:
Variable | Unique_Values
var_1 | 1
var_2 | 1
var_3 | 3
Run Code Online (Sandbox Code Playgroud)
我尝试使用独特的功能玩循环,例如
for(i in names(Testdata)){
# Code using unique function
}
Run Code Online (Sandbox Code Playgroud)
但我怀疑有一种更简单的方法.
sgi*_*ibb 28
你可以使用apply:
apply(Testdata, 2, function(x) length(unique(x)))
# var_1 var_2 var_3
# 1 1 3
Run Code Online (Sandbox Code Playgroud)
lee*_*sej 10
在dplyr:
Testdata %>% summarise_all(n_distinct)
Run Code Online (Sandbox Code Playgroud)
这实际上是对@Ananda Mahto评论的改进.它不适合评论,所以我决定添加作为答案.
sapply实际上比lapply它快一点,并以更紧凑的形式给出输出,就像输出一样apply.
实际数据的测试运行结果:
> start <- Sys.time()
> apply(datafile, 2, function(x)length(unique(x)))
symbol. date volume
1371 261 53647
> Sys.time() - start
Time difference of 1.619567 secs
>
> start <- Sys.time()
> lapply(datafile, function(x)length(unique(x)))
$symbol.
[1] 1371
$date
[1] 261
$volume
[1] 53647
> Sys.time() - start
Time difference of 0.07129478 secs
>
> start <- Sys.time()
> sapply(datafile, function(x)length(unique(x)))
symbol. date volume
1371 261 53647
> Sys.time() - start
Time difference of 0.06939292 secs
Run Code Online (Sandbox Code Playgroud)
将datafile有大约350万行.
引用帮助文本:
sapply是一个用户友好的版本和lapply的包装器,默认情况下,通过应用simplify2array(),返回一个向量,矩阵,或者,如果需要,则返回一个数组(如果合适).sapply(x,f,simplify = FALSE,USE.NAMES = FALSE)与lapply(x,f)相同.
使用lengths功能:
lengths(lapply(Testdata, unique))
# var_1 var_2 var_3
# 1 1 3
Run Code Online (Sandbox Code Playgroud)