Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 为一个数据帧编制索引,创建两个列表,一个带有示例,并对它们进行比较_R_Dataframe - Fatal编程技术网

R 为一个数据帧编制索引,创建两个列表,一个带有示例,并对它们进行比较

R 为一个数据帧编制索引,创建两个列表,一个带有示例,并对它们进行比较,r,dataframe,R,Dataframe,我有两个数据帧,如下所示: >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 NAM

我有两个数据帧,如下所示:

>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
n.samp <- 4
n <- 100 

samp.names <- replicate(n, sample(df.A$NAME, n.samp))
library(data.table)
DT.B <- as.data.table(df.B)
setkey(DT.B, NAME)
tmp <- DT.B[c(samp.names),]
tmp[, grp := rep(seq_len(n), each=n.samp) ]
sum.random <- tmp[,sum(index), by=grp]$V1
我想对
df.A
中的元素进行多次(例如100次)采样,每次选择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))
但也是两个慢,

有改进代码的想法吗?当然我错过了一些明显的东西

谢谢

也许是这样:

>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
n.samp <- 4
n <- 100 

samp.names <- replicate(n, sample(df.A$NAME, n.samp))
library(data.table)
DT.B <- as.data.table(df.B)
setkey(DT.B, NAME)
tmp <- DT.B[c(samp.names),]
tmp[, grp := rep(seq_len(n), each=n.samp) ]
sum.random <- tmp[,sum(index), by=grp]$V1

尝试这种方法,您可以避免R中的
for循环
(我假设样本量=3)

数据准备

MyDF1抽样索引将始终与df2匹配,因为df1的索引与df2的索引相同。df2中应该有唯一的索引,否则解决这个问题(即df1中不存在的索引)没有意义。我要做的是以随机方式对df1进行采样,检索不同的
NAME
,然后询问这些
NAME
在df2中有哪些索引。例如,name
A
在df1中为1,而在df2中为7,然后您需要这些索引的总和,对吗?感谢您的澄清。是的@Metrics,没错,有什么想法吗?我已经发布了答案。您可以检查一下,您是否可以详细解释第一行
samp.names这准备了一个data.table,用于连接DT.B。如果
NAME
s不是唯一的,我们需要在连接之前创建分组变量。我们需要设置连接的键。
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