如何用类似apply的方式计算R数据框df各列的重复值数量?
Got it!你想要用类似apply(df, 2, max)的方式计算数据框每列的重复值数量,这很容易实现,咱们直接用apply配合自定义函数就能搞定,下面给你两种常用的思路:
方法1:总观测数减去唯一值数量
核心逻辑是:每列的重复值总数 = 列的总行数 - 列中唯一值的数量。用apply对每列应用这个逻辑即可:
# 计算每列重复值数量 duplicate_counts <- apply(df, 2, function(x) length(x) - length(unique(x)))
这里的匿名函数function(x)会依次接收每一列的向量x,length(x)获取该列的总行数,length(unique(x))得到该列不重复值的数量,两者相减就是重复值的总个数(比如某个值出现3次,会被统计为2次重复,这是常规的重复值计数逻辑)。
方法2:用duplicated()直接统计重复项
另一种更直观的方式是用duplicated()函数——它会给每一个非首次出现的重复元素标记为TRUE,我们只需要用sum()统计这些标记的数量就行:
duplicate_counts <- apply(df, 2, function(x) sum(duplicated(x)))
这个方法的结果和方法1完全一致,因为sum(duplicated(x))本质上就是在计算「总观测数 - 唯一值数量」。
示例验证
拿你给出的示例数据(假设df共6行)来测试:
var1全是2018-12-31,重复数量为6-1=5var4全是0,重复数量也是5var5里0出现了2次,其他值都是唯一的,重复数量为1
运行代码后,duplicate_counts会返回一个对应每列的结果向量:
var1 var2 var3 var4 var5 5 0 0 5 1
另外,如果你更习惯用sapply(它对数据框的列操作更友好,返回结果同样是向量),写法可以简化成:
duplicate_counts <- sapply(df, function(x) length(x) - length(unique(x)))
效果和apply完全相同。
内容的提问来源于stack exchange,提问作者adrCoder
相关产品推荐
相关产品推荐

