我想获得数据帧的每个列中的唯一值的数量。假设我有以下数据框:
DF <- data.frame(v1 = c(1,2,3,2), v2 = c("a","a","b","b"))
那么它应该返回v1有3个不同的值,v2有2个不同的值。
我尝试了唯一(DF),但它不起作用,因为每行都不同。
或者使用unique
:
rapply(DF,function(x)length(unique(x)))
v1 v2
3 2
sapply(DF, function(x) length(unique(x)))
这是一种方法:
> lapply(DF, function(x) length(table(x)))
$v1
[1] 3
$v2
[1] 2
这基本上列出了每列的唯一值。使用length
告诉你数字。删除length
将显示实际的唯一值表。
在dplyr
:
DF %>% summarise_all(funs(n_distinct(.)))
为了完整起见:自2015年9月19日的CRAN版本1.9.6起,data.table
包中包含帮助函数uniqueN()
,这使我们免于写作
function(x) length(unique(x))
在打电话给apply()
的兄弟姐妹时:
sapply(DF, data.table::uniqueN)
v1 v2 3 2
请注意,为了在这里使用data.table
,既不需要加载DF
包也不需要data.table
强制类uniqueN()
。
这应该适用于为每个变量获取唯一值:
length(unique(datasetname$variablename))
我认为像这样的功能会给你你想要的东西。除了每个数据帧的列中有多少个NA之外,这还显示了唯一值。只需插入您的数据框,您就可以开始了。
totaluniquevals <- function(df) {
x <<- data.frame("Row Name"= numeric(0), "TotalUnique"=numeric(0), "IsNA"=numeric(0))
result <- sapply(df, function(x) length(unique(x)))
isnatotals <- sapply(df, function(x) sum(is.na(x)))
#Now Create the Row names
for (i in 1:length(colnames(df))) {
x[i,1] <<- (names(result[i]))
x[i,2] <<- result[[i]]
x[i,3] <<- isnatotals[[i]]
}
return(x)
}
测试:
DF <- data.frame(v1 = c(1,2,3,2), v2 = c("a","a","b","b"))
totaluniquevals(DF)
Row.Name TotalUnique IsNA
1 v1 3 0
2 v2 2 0
然后,您可以在任何列上使用unique,以查看特定的唯一值。
独特的(DF $ v2)[1] a b级别:a b
这将为您在第1列的DF数据框中提供唯一值。
unique(sc_data[,1])