R 如何在应用程序中提高应用程序的性能
经过一段时间的提问,我已经到了下面的代码 我的.csv文件长1250行,宽2500多列。列中的数据类型事先未知,可以是正数或字符串等 我试图实现的是将具有95%相等项的行保留给任何其他行(2500列中2375列中的任何一列中的值相等) 起初我试图检查相似性,但后来我意识到,用消去法而不是聚合法将需要更少的计算量。因为我在寻找95%的相似性,如果一行与数据集中的每一行有2500-2375=125+1个不相等的列,那么我可以确定这一行永远不会与其他行有95%的相似性,并且可以从进一步的处理中删除 下面的代码成功地查看了所有行的最左边的checkColCount(%6)列,然后删除与所有其他行(如果存在)不相似的行,然后移动到下一个checkColCount列。xdat中的结果行(如果有)是那些具有95%以上相似列的行 问题是时间,我试图将其放入parApply,但结果与此不同(中间有许多空行)。我假设,理想情况下,我应该能够将下面的两个应用程序并行化 注意:我使用的是windows操作系统 工作代码:R 如何在应用程序中提高应用程序的性能,r,performance,parallel-processing,apply,R,Performance,Parallel Processing,Apply,经过一段时间的提问,我已经到了下面的代码 我的.csv文件长1250行,宽2500多列。列中的数据类型事先未知,可以是正数或字符串等 我试图实现的是将具有95%相等项的行保留给任何其他行(2500列中2375列中的任何一列中的值相等) 起初我试图检查相似性,但后来我意识到,用消去法而不是聚合法将需要更少的计算量。因为我在寻找95%的相似性,如果一行与数据集中的每一行有2500-2375=125+1个不相等的列,那么我可以确定这一行永远不会与其他行有95%的相似性,并且可以从进一步的处理中删除 下
xdat <- read.csv("ttt.csv", header =TRUE, stringsAsFactors = FALSE )
#Normally, I'm interested in at least 95% of the data to be **equal**
perc <- 95
#replacing NA's with unique random negative numbers to make sures that NA's don't appear as identical between rows
xdat[is.na(xdat)] <- -1 * sample(dim(xdat)[1]*dim(xdat)[2], size=sum(is.na(xdat)), replace=FALSE)
xdat<-rbind(xdat,xdat[1,])
compareRow <- function(a,b)
{
sum(a!=b,na.rm=TRUE)
}
#adding the first row to the end for testing
xdat<-rbind(xdat,xdat[1,])
system.time( try(
for (firstColToCheck in seq(1,100-(100-perc),100-perc)){
lastColToCheck <- 100-perc +1 + firstColToCheck
checkColCount <- lastColToCheck- firstColToCheck +1
xx <- apply(xdat[,firstColToCheck:lastColToCheck],1, function(a)
{
apply(xdat[,firstColToCheck:lastColToCheck],1, function(b) {compareRow(a,b) })
})
sumXX <-rowSums(xx)
checkValue <- checkColCount*(nrow(xdat)-1)
xdat<-xdat[rowSums(xx)<checkValue,]
cat(firstColToCheck , " ")
gc(verbose = FALSE)
} , silent = TRUE )
)
xdat0 <- xdat
# user system elapsed
# 5.22 0.00 5.21
样本结果假设我不要求95%,但要求70%相等:
id group hs.grad race gender age m.status political n.kids income
1 treat yes white male 19 never republican 1 4716
10 treat yes white male 19 divorced republican 1 4716
只应保留第1行和第10行,因为它们有8列相等(超过70%),所有其他行与任何其他行至少有4列不同,因此它们已从集合中删除。快速阅读Q,您可以在不显式循环的情况下完成此操作。(例如,您可以使用
proxy::dist(d,function(x,y)sum(x==y),diag=TRUE)
获得跨行的类似观察计数,您可以将其除以NCOL以获得比例。-未测试速度)但如果您可以添加一个小示例数据集来说明您的问题,则肯定会有所帮助,例如,使用维度10x10,然后显示预期结果。我不能使用相似性函数,在比较列时,我需要明确查看相等性。当我比较100对20和100对99时,相似性函数会创建不同的距离,但对我来说两者都不相等,结果都应该为false。上面注释中手动添加的函数测试相等性。@user20650抱歉,我没有看到最后一部分,我的思绪停在dist:)用我的非并行初始版本替换你的函数会使整个过程慢得多。用户系统运行80.26 0.00 80.27快速读取你的Q,你也许可以不用显式循环来完成这项工作。(例如,您可以使用proxy::dist(d,function(x,y)sum(x==y),diag=TRUE)
获得跨行的类似观察计数,您可以将其除以NCOL以获得比例。-未测试速度)但如果您可以添加一个小示例数据集来说明您的问题,则肯定会有所帮助,例如,使用维度10x10,然后显示预期结果。我不能使用相似性函数,在比较列时,我需要明确查看相等性。当我比较100对20和100对99时,相似性函数会创建不同的距离,但对我来说两者都不相等,结果都应该为false。上面注释中手动添加的函数测试相等性。@user20650抱歉,我没有看到最后一部分,我的思绪停在dist:)用我的非并行初始版本替换你的函数会让整个过程慢得多用户系统运行80.26 0.00 80.27
id group hs.grad race gender age m.status political n.kids income
1 treat yes white male 19 never republican 1 4716
2 control yes black male 30 divorced independent 2 4724
3 control yes black female 32 married republican 3 1096
4 control no white male 35 divorced republican 4 1084
5 control yes white female 18 married republican 5 4720
6 control yes asian male 22 married independent 6 2577
7 control yes white female 26 never democrat 7 3154
8 control yes asian male 40 married republican 8 3267
9 control yes asian female 23 married independent 9 3603
10 treat yes white male 19 divorced republican 1 4716
id group hs.grad race gender age m.status political n.kids income
1 treat yes white male 19 never republican 1 4716
10 treat yes white male 19 divorced republican 1 4716