【发布时间】:2013-11-04 05:01:47
【问题描述】:
我想获取数据框每一列中唯一值的数量。 假设我有以下数据框:
DF <- data.frame(v1 = c(1,2,3,2), v2 = c("a","a","b","b"))
那么它应该返回 v1 有 3 个不同的值,v2 有 2 个。
我尝试了 unique(DF),但它不起作用,因为每一行都不一样。
【问题讨论】:
我想获取数据框每一列中唯一值的数量。 假设我有以下数据框:
DF <- data.frame(v1 = c(1,2,3,2), v2 = c("a","a","b","b"))
那么它应该返回 v1 有 3 个不同的值,v2 有 2 个。
我尝试了 unique(DF),但它不起作用,因为每一行都不一样。
【问题讨论】:
或者使用unique:
rapply(DF,function(x)length(unique(x)))
v1 v2
3 2
【讨论】:
sapply(DF, function(x) length(unique(x)))
【讨论】:
在dplyr:
DF %>% summarise_all(funs(n_distinct(.)))
【讨论】:
这是一种方法:
> lapply(DF, function(x) length(table(x)))
$v1
[1] 3
$v2
[1] 2
这基本上列出了每列的唯一值。在上面使用length 会告诉您号码。删除 length 将显示唯一值的实际表。
【讨论】:
在dplyr (>=1.0.0 - june 2020):
DF %>% summarize_all(n_distinct)
v1 v2
1 3 2
【讨论】:
为了完整起见:自 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
【讨论】:
<<-?这将覆盖函数外部定义的任何对象x。
totaluniquevals <- function(df) data.frame(Row.Name = names(df), TotalUnique = sapply(df, function(x) length(unique(x))), IsNA = sapply(df, function(x) sum(is.na(x))))
这将在第 1 列的 DF 数据框中为您提供唯一值。
unique(sc_data[,1])
【讨论】: