r - 计算相同行数

时间:2015-09-16 08:56:55

标签: r matrix count row

我希望这不是一个重复的问题(我尽力看看它是否已被问过)。我有一个数据框,想要计算有多少行相同。

df = data.frame(ID = c("id1", "id2", "id3", "id4", "id5", "id6", "id7", "id8", "id9"),
            Val1 = c("A", "B", "C", "A", "A", "B", "D", "C", "D"),
            Val2 = c("B", "C", NA, "B", "B", "D", "E", "D", "E"),
            Val3 = c("C", NA, NA, "C", "C", "B", NA, NA,NA),
            Val4 = c("D", NA, NA, "E", "D", NA, NA, NA, NA))
> df
   ID Val1 Val2 Val3 Val4
1 id1    A    B    C    D
2 id2    B    C <NA> <NA>
3 id3    C <NA> <NA> <NA>
4 id4    A    B    C    E
5 id5    A    B    C    D
6 id6    B    D    B <NA>
7 id7    D    E <NA> <NA>
8 id8    C    D <NA> <NA>
9 id9    D    E <NA> <NA>

因此,对于此示例,我希望返回值为A B C D 2D E 2B C <NA> <NA> 1等等。 尝试使用table,但我得到Error in table(type_table) : attempt to make a table with >= 2^31 elements而我的df只有&#34;只有&#34; ~140K行。我想在更大的数据集上应用它。试过summarise但也许我不知道如何正确应用它。 aggregate是一种选择吗?谢谢

2 个答案:

答案 0 :(得分:7)

table无效的原因是因为它分别处理每个列并尝试按元素组合而不是按行组合查找。

您可以尝试使用do.call(paste(组合按行粘贴元素并在其上运行table

table(do.call(paste, df[-1]))
# A B C D    A B C E  B C NA NA   B D B NA  C D NA NA C NA NA NA  D E NA NA 
#       2          1          1          1          1          1          2 

如果table效率不高,我们可以尝试使用.N中的data.table代替

library(data.table) 
setDT(df)[, .N, by = c(names(df)[-1])]
#    Val1 Val2 Val3 Val4 N
# 1:    A    B    C    D 2
# 2:    B    C   NA   NA 1
# 3:    C   NA   NA   NA 1
# 4:    A    B    C    E 1
# 5:    B    D    B   NA 1
# 6:    D    E   NA   NA 2
# 7:    C    D   NA   NA 1

答案 1 :(得分:0)

使用data.table

library(data.table)
setDT(df)
df[, dups := 1:.N, setdiff(names(df), "ID")]
df[, .SD[.N], setdiff(names(df), c("ID", "dups"))][dups != 1]

除了ID之外的所有内容,重复组内的索引项,然后选择每个组中的最后一行(当复制索引不是1时)。