R中的并行处理使用;平行;包裹

R中的并行处理使用;平行;包裹,r,parallel-processing,cluster-computing,vectorization,rstudio,R,Parallel Processing,Cluster Computing,Vectorization,Rstudio,我有两个数据帧: > head(k) V1 1 1814338070 2 1199215279 3 1283239083 4 1201972527 5 404900682 6 3093614019 > head(g) start end state value 1 16777216 16777471 queensland 15169 2 16777472 16778239 fujian 0 3 16778240 1

我有两个数据帧:

> head(k)
          V1
1 1814338070
2 1199215279
3 1283239083
4 1201972527
5  404900682
6 3093614019

> head(g)
  start    end      state      value
1 16777216 16777471 queensland 15169
2 16777472 16778239     fujian     0
3 16778240 16779263   victoria 56203
4 16779264 16781311  guangdong     0
5 16781312 16781823      tokyo     0
6 16781824 16782335      aichi     0

> dim(k)
[1] 624979      1
> dim(g)
[1] 5510305       4
我想比较data.frame(k)中的每个值,并匹配它是否适合data.frame(g)的开始和结束范围,以及它是否返回状态值和data.frame(g)中的值

我遇到的问题是由于数据帧的尺寸,要在我的计算机上进行匹配并返回所需的值需要5个小时。我使用了以下方法,但我无法使用计算机上的所有内核,甚至无法使其正常工作:

return_first_match_position <- function(int, start,end) {
  match = which(int >= start & int <= end)
  if(length(match) > 0){
    return(match[1])
  }
  else {
    return(match)
  }
}

library(parallel)
cl = makeCluster(detectCores())
matches = Vectorize(return_first_match_position, 'int')(k$V1,g$start, g$end)
p = parSapply(cl, Vectorize(return_first_match_position, 'int')(k$V1,g$start, g$end), return_first_match_position)
stopCluster(cl)
return\u first\u match\u position=start&int 0){
返回(匹配[1])
}
否则{
返回(匹配)
}
}
图书馆(平行)
cl=makeCluster(detectCores())
匹配=矢量化(返回第一个匹配位置“int”)(k$V1,g$start,g$end)
p=parSapply(cl,矢量化(返回第一个匹配位置,'int')(k$V1,g$start,g$end),返回第一个匹配位置)
停止簇(cl)

所需的输出是data.frame(g)中data.frame(k)中的数字的每个匹配显示状态和值的百分比次数

想知道在R中有一种智能的并行处理方法吗?
还有谁能建议(任何来源)我如何学习/改进R中的写作功能?

我想你想做一个滚动加入。使用data.table可以非常高效地完成此操作:

DF1 <- data.frame(V1=c(1.5, 2, 0.3, 1.7, 0.5))
DF2 <- data.frame(start=0:3, end=0.9:3.9, 
                  state=c("queensland", "fujian", "victoria", "guangdong"),
                  value=1:4)

library(data.table)
DT1 <- data.table(DF1, key="V1")
DT1[, pos:=V1]
#    V1 pos
#1: 0.3 0.3
#2: 0.5 0.5
#3: 1.5 1.5
#4: 1.7 1.7
#5: 2.0 2.0
DT2 <- data.table(DF2, key="start")
#   start end      state value
#1:     0 0.9 queensland     1
#2:     1 1.9     fujian     2
#3:     2 2.9   victoria     3
#4:     3 3.9  guangdong     4

DT2[DT1, roll=TRUE]
#   start end      state value pos
#1:     0 0.9 queensland     1 0.3
#2:     0 0.9 queensland     1 0.5
#3:     1 1.9     fujian     2 1.5
#4:     1 1.9     fujian     2 1.7
#5:     2 2.9   victoria     3 2.0

DF1因此,不要经常编辑最后一个(相当于制作一个新的)。。这就是你想要的吗:
我注意到,在下一行开始之前,您的结束总是1,所以您(我想)想要的是,只需找出每个间隔内有多少个,并为该间隔指定该范围的状态和值。所以

set.seed(123)
c1=seq(1,25,4)
c2=seq(4,30,4)
c3=letters[1:7]
c4=sample(seq(1,7),7)
c.all=cbind(c1,c2,c3,c4)

> c.all  ### example data.frame that looks similar to yours
     c1   c2   c3  c4 
[1,] "1"  "4"  "a" "3"
[2,] "5"  "8"  "b" "7"
[3,] "9"  "12" "c" "2"
[4,] "13" "16" "d" "1"
[5,] "17" "20" "e" "6"
[6,] "21" "24" "f" "5"
[7,] "25" "28" "g" "4"

k1 <- sample(seq(1,18),20,replace=T)

k1
 [1]  2  1 15 14  4 15  3 17 18  1  4  3 16 15  2  4  8 11  7 16

fallsin <- cut(k1,  c(as.numeric(c.all[,1]), max(c.all[,2])), labels=paste(c.all[,3],  c.all[,4],sep=':'), right=F)

fallsin
[1] a:3 a:3 e:6 e:6 a:3 e:6 a:3 f:5 f:5 a:3 a:3 a:3 e:6 e:6 a:3 a:3 c:2 d:1 b:7 e:6
Levels: a:3 b:7 c:2 d:1 e:6 f:5 g:4
prop.table(table(fallsin))

 a:3  b:7  c:2  d:1  e:6  f:5  g:4 
0.45 0.05 0.05 0.05 0.30 0.10 0.00 
set.seed(123)
c1=序号(1,25,4)
c2=序列(4,30,4)
c3=字母[1:7]
c4=样本(序号(1,7),7)
c、 全部=cbind(c1、c2、c3、c4)
>c.all####示例data.frame与您的类似
c1 c2 c3 c4
[1,][1”“4”“a”“3”
[2,][5”“8”“b”“7”
[3,][9”“12”“c”“2”
[4,][13”“16”“d”“1”
[5,][17”“20”“e”“6”
[6,][21”“24”“f”“5”
[7,][25”“28”“g”“4”

你能举一个期望输出的例子吗?我相信我为您提供了一个解决方案,但我想确保我确切地知道您在寻找什么,例如,如果在data.frame(k)中,1814338070的值在data.frame(g)中介于16777472-16778239之间。frame(g)所需的输出是%state和%value。。只是一个FYI状态和数据中的值。帧(g)是系数。因此,对于k中的每个值,您要查找状态,值startdesired输出是%状态和值显示的次数,该次数与数据中的每个数字匹配。帧(k)在数据。帧(g)中。我很抱歉,我应该把这一点说清楚,我正在编辑我的问题。你能不能先把你的“g”和“k”输入dput(),然后展示一个所需输出的示例?这将有助于洗液尝试你的方法,也会被卡住….>很明显,你没有提供足够的信息。如果您使用
df2 df2,或者您的数据有可疑之处,或者您在data.table中发现了一个bug,会发生什么。没有一个可复制的例子就说不出来。如果您可以创建一个,您应该将此报告给data.table maintainers.+1@user3006691碰巧,这些错误看起来很熟悉,并且在R-Forge提供的v1.9.3中已修复。如果升级不能解决它,是的,我们需要看到一个可复制的例子。是的,这正是我试图解释的(但失败了)。只是对于两个data.frames k和g,我无法更快地完成这项工作,因为它们在data.table方面还没有那么好,但我认为对data.table进行剪切(或类似的操作)会更好地进行排序和索引,所以我要查看“data.table”,并寻找类似的函数(接近罗兰的建议)