r - 计算相同行的数量
r - count number of identical rows
我希望这不是一个重复的问题(我尽力查看是否已经有人问过)。我有一个数据框,想计算有多少行是相同的。
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>
所以对于这个例子,我希望 return 会是 A B C D 2
、D E 2
、B C <NA> <NA> 1
等等。
尝试使用 table
但我得到一个 Error in table(type_table) : attempt to make a table with >= 2^31 elements
并且我的 df 有 "only" ~140K 行。我想将其应用于更大的数据集。也尝试过 summarise
但可能我不知道如何正确应用它。 aggregate
是一个选项吗?谢谢
和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
之外的所有内容进行分组,在重复组中索引项目,然后 select 每组中的最后一行(当重复索引不是 1
时)。
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
不够有效,我们可以尝试使用 data.table
中的 .N
代替
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
我希望这不是一个重复的问题(我尽力查看是否已经有人问过)。我有一个数据框,想计算有多少行是相同的。
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>
所以对于这个例子,我希望 return 会是 A B C D 2
、D E 2
、B C <NA> <NA> 1
等等。
尝试使用 table
但我得到一个 Error in table(type_table) : attempt to make a table with >= 2^31 elements
并且我的 df 有 "only" ~140K 行。我想将其应用于更大的数据集。也尝试过 summarise
但可能我不知道如何正确应用它。 aggregate
是一个选项吗?谢谢
和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
之外的所有内容进行分组,在重复组中索引项目,然后 select 每组中的最后一行(当重复索引不是 1
时)。
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
不够有效,我们可以尝试使用 data.table
中的 .N
代替
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