这种聚合方法是否可以有效地处理数百万数据?
Does this aggregate approach work efficiently with a millions of data?
我正试图摆脱 dataframe/matrix 与其他 values/classes 不同的价值观。
即这里是一个示例初始 table:
P | V
------ | ------
par | 123
par | 1234
par | 12345
par | 123456
pat | 123
pat | 1234
pat | 12345
pat | 1234567
pay | 123456
pay | 789
pay | 967
如您所见,有些值(V 列)是唯一的,并且与 P 列的某些值不同。这些值是
P | V
------ | ------
pat | 1234567
pay | 789
pay | 967
这是预期的输出。
为此,我使用了聚合函数(见下文)),但实际数据会大得多。它们可以达到 2-3 百万行甚至更多。
您认为以下代码是否可以处理并响应如此多的数据,或者是否有其他方法可以提高效率?
mat = c("par","par","par","par","pat","pat","pat","pat","pay","pay","pay")
mat = as.data.frame(cbind("P"=mat, "V"=c("123","1234","12345","123456","123","1234","12345","1234567","123456","789","967")))
uniquePs = matrix(unique(mat$P))
diff = aggregate(P~V, mat, FUN=unique)
distinctVs = diff[which( grepl(":|," , as.character(diff$P) ) == FALSE ),]
distinctVs$P = uniquePs[as.numeric(distinctVs$P)]
谢谢。
这是您可以使用的另一种方法。 2-3百万行的效率应该没问题:
subset(df, ave(as.character(P), V, FUN = function(x) length(unique(x))) == 1L)
# P V
#8 pat 1234567
#10 pay 789
#11 pay 967
这里有一个更简单的基础 R 方法:
subset(unique(df), !(duplicated(V) | duplicated(V, fromLast = TRUE)))
# P V
#8 pat 1234567
#10 pay 789
#11 pay 967
也许我们需要
library(data.table)
setDT(df1)[, .SD[uniqueN(P)==1], V]
# V P
#1: 1234567 pat
#2: 789 pay
#3: 967 pay
我正试图摆脱 dataframe/matrix 与其他 values/classes 不同的价值观。
即这里是一个示例初始 table:
P | V
------ | ------
par | 123
par | 1234
par | 12345
par | 123456
pat | 123
pat | 1234
pat | 12345
pat | 1234567
pay | 123456
pay | 789
pay | 967
如您所见,有些值(V 列)是唯一的,并且与 P 列的某些值不同。这些值是
P | V
------ | ------
pat | 1234567
pay | 789
pay | 967
这是预期的输出。
为此,我使用了聚合函数(见下文)),但实际数据会大得多。它们可以达到 2-3 百万行甚至更多。
您认为以下代码是否可以处理并响应如此多的数据,或者是否有其他方法可以提高效率?
mat = c("par","par","par","par","pat","pat","pat","pat","pay","pay","pay")
mat = as.data.frame(cbind("P"=mat, "V"=c("123","1234","12345","123456","123","1234","12345","1234567","123456","789","967")))
uniquePs = matrix(unique(mat$P))
diff = aggregate(P~V, mat, FUN=unique)
distinctVs = diff[which( grepl(":|," , as.character(diff$P) ) == FALSE ),]
distinctVs$P = uniquePs[as.numeric(distinctVs$P)]
谢谢。
这是您可以使用的另一种方法。 2-3百万行的效率应该没问题:
subset(df, ave(as.character(P), V, FUN = function(x) length(unique(x))) == 1L)
# P V
#8 pat 1234567
#10 pay 789
#11 pay 967
这里有一个更简单的基础 R 方法:
subset(unique(df), !(duplicated(V) | duplicated(V, fromLast = TRUE)))
# P V
#8 pat 1234567
#10 pay 789
#11 pay 967
也许我们需要
library(data.table)
setDT(df1)[, .SD[uniqueN(P)==1], V]
# V P
#1: 1234567 pat
#2: 789 pay
#3: 967 pay