繁体   English   中英

计算 dataframe 中每个样本的唯一类别并显示唯一类别

[英]Count unique categories for each sample in a dataframe and display unique categories

我有一个数据框示例

       Sample1    Sample2      Sample3      Sample4        
Cat     0           0            0           1
Dog     0           0            1           0
Rabbit  0           0            0           1
Mouse   1           1            1           1 
Snake   1           1            0           1
....

我想计算每个样本的独特动物的数量。 理想情况下,为每个样本生成一个列表,显示独特的动物是什么。 所以你可以看到猫是样本 4 独有的,狗是样本 3 独有的,兔子是样本 3 独有的。但是样本 1 和样本 2 没有任何独有的动物,因为其他样本包含这些动物。 我用它来计算sapply(data, function(x) length(unique(x)))但是数据集太大了,我不知道这是否准确。

谢谢你的帮助!!

您可以像这样使用lapply执行此操作:

uniqueList = lapply(df, unique)
numberOfUniques = lapply(uniqueList, length)

例子:

使用mtcars进行df

> uniqueList

$mpg
 [1] 21.0 22.8 21.4 18.7 18.1 14.3 24.4 19.2 17.8 16.4 17.3 15.2 10.4 14.7 32.4 30.4 33.9 21.5 15.5
[20] 13.3 27.3 26.0 15.8 19.7 15.0

$cyl
[1] 6 4 8

$disp
 [1] 160.0 108.0 258.0 360.0 225.0 146.7 140.8 167.6 275.8 472.0 460.0 440.0  78.7  75.7  71.1 120.1
[17] 318.0 304.0 350.0 400.0  79.0 120.3  95.1 351.0 145.0 301.0 121.0

$hp
 [1] 110  93 175 105 245  62  95 123 180 205 215 230  66  52  65  97 150  91 113 264 335 109

$drat
 [1] 3.90 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.07 2.93 3.00 3.23 4.08 4.93 4.22 3.70 3.73 4.43 3.77
[20] 3.62 3.54 4.11

$wt
 [1] 2.620 2.875 2.320 3.215 3.440 3.460 3.570 3.190 3.150 4.070 3.730 3.780 5.250 5.424 5.345 2.200
[17] 1.615 1.835 2.465 3.520 3.435 3.840 3.845 1.935 2.140 1.513 3.170 2.770 2.780

$qsec
 [1] 16.46 17.02 18.61 19.44 20.22 15.84 20.00 22.90 18.30 18.90 17.40 17.60 18.00 17.98 17.82 17.42
[17] 19.47 18.52 19.90 20.01 16.87 17.30 15.41 17.05 16.70 16.90 14.50 15.50 14.60 18.60

$vs
[1] 0 1

$am
[1] 1 0

$gear
[1] 4 3 5

$carb
[1] 4 1 2 3 6 8

如果您想要按行或列的唯一值数量,我没有得到。 我建议两者

如果你有大量数据,你应该看看data.table

让我们举一个愚蠢的例子

library(data.table)
df = data.table(
  x = c(1,2),
  y = c(1,1),
  z = c(2,3)
)

按列唯一

最简单的答案:

df[,lapply(.SD,uniqueN)]

按行唯一

一个解决方案可能是将您的数据转换为长格式并按组进行计数

然后,您生成一个行标识符( seq_len(.N)data.table动词中表示 1 到n )。 You use that column to pivot your data ( melt is a built-in function in data.table , equivalent to pivot_long in tidyr) and then use uniqueN built-in function from data.table .

df[,'id' := seq_len(.N)]
df2 <- melt(df, id.vars = "id")
df2[, (count_unique = uniqueN(value)), by = "id"]

df2[, (count_unique = uniqueN(value)), by = "id"]
   id V1
1:  1  2
2:  2  3

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM