0

次のような 2 つのデータ フレームがあります。

>df.A
NAME    pvalues    index
A       0.9        1
B       0.8        2
C       0.7        3
D       0.6        4
E       0.5        5
F       0.4        6
G       0.3        7
H       0.2        8
I       0.1        9

>df.B
NAME    VALUE      index
B       100        1
G       99         2
H       98         3
C       97         4
D       96         5
F       95         6
A       94         7
I       93         8
E       92         9

何度も (たとえば 100)要素をサンプリングしてdf.A、毎回 4 つの要素を選択し、df.Bこれらの新しい data.frames に一致するインデックスを調べ、最後にこれらの新しい data.frames のインデックスを合計します。

私のアプローチは次のとおりです。

res = list(data.frame())
for (i in 1:100){
res[[i]] = as.data.frame(sample(df.A$NAME, 4))
names(res[[i]]) <- 'NAME'
 }

func <- function(x,y){merge(x, y, by.x=names(x)[1], by.y=names(y)[1])}
rand <- lapply(res, func, df.B)
sum.random = sapply(rand, function(x) sum(x$index))

どちらdata.framesも私の実際のデータ (13000 行と 4 列) の要約であるため、プロセスの速度が重要になります。merge私の現在のアプローチには長い時間がかかりますが、そのステップのせいだと思います。

私も試してみましたdata.table

dt = data.table(df.B, key='NAME')
fn = function(x){dt[x]};
rand2 = lapply(res, func)

しかし、それはまた 2 遅いです。

コードを改善するためのアイデアはありますか? 確かに私は明らかな何かを見逃しています

ありがとう

4

2 に答える 2

0

このアプローチを試してみると、R で回避できますfor loop: (サンプル サイズ = 3 と仮定します)

Data preparation
mydf1<-list(df1)
mydf1a<-rep(mydf1,100)
mydf2<-list(df2)
mydf2a<-rep(mydf2,100)
sampleno<-as.list(1:100)

サンプリング

    set.seed(1)
kk<-Map(function(x) x[sample(1:nrow(x),3,replace=FALSE),], mydf1a)
ll<-Map(function(x,y,z)cbind(sampleno=z,mysum=sum(x[which(x[,1] %in% y[,1]),3])),kk,mydf2a,sampleno)
     myresult<-data.frame(do.call(rbind,ll))
 head(myresult)
  sampleno mysum
1        1    17
2        2    18
3        3    20
4        4    11
5        5    17
6        6    18
于 2013-09-21T14:29:00.083 に答える