gpt4 book ai didi

r - 提取数据帧的行索引,其条目对应于另一个数据帧的行

转载 作者:行者123 更新时间:2023-12-04 09:45:54 25 4
gpt4 key购买 nike

我已经挣扎了一段时间,我找不到出路。这是我的问题。

我有 2 个数据框:

    df1 <- data.frame(replicate(3,sample(1:10,20,rep=TRUE)))
df1
X1 X2 X3
1 10 1 9
2 3 4 2
3 7 6 8
4 8 10 7
5 5 7 5
6 8 5 9
7 9 8 4
8 6 2 7
9 2 9 6
10 5 2 9

df2 <- data.frame(df1[sample(nrow(df1),4), ])
df2
X1 X2 X3
8 6 2 7
3 7 6 8
10 5 2 9
7 9 8 4

我想创建一个 length(x) = length(df1) 的向量 x,其中每行 df1 包含 df2 中相应行的行索引(即 df1 和 df2 之间每一列的确切值相同)。

考虑一下:
    dim(df1)
[1] 1096188 3

dim(df2)
[1] 256 3

并且 df1 有几行具有相同的值(即相应的行索引将相同),原则上 df1 中的所有行都应该与 df2 中的行匹配。

预期输出将是:
    x
[1] 0 0 2 0 0 0 4 1 0 3

希望这足够清楚了......

你能帮我吗?

谢谢,

皮埃拉

最佳答案

这是 data.table 的选项:

require(data.table)

# first set the original orders (data.frame will be sorted when doing setkey)
setDT(df1)[, ori := .I]
setDT(df2)[, ind_df2 := .I]

# define keys
setkey(df1, X1, X2, X3)
setkey(df2, X1, X2, X3)

# compute the indices of the df1 line in df2
x <- df2[df1, ind_df2]
# put the nomatch to 0
x[is.na(x)] <- 0

# Finally, put the original orders back and delete the variable ori
x <- x[order(df1$ori)]
df2 <- df2[order(df2$ind_df2)]
df1[, ori:=NULL]
df2[, ind_df2:=NULL]

结果 x(使用您的数据):
x
#[1] 0 0 2 0 0 0 4 1 0 3

@Frank 建议的另一个更简单有效的选项:
setkeyv(setDT(df2)[,ii:=.I],setdiff(names(df2),"ii"))
x <- df2[df1]$ii
x[is.na(x)] <- 0

@nicola 答案、@Frank 建议和我的答案之间的一些基准,在 100000 行 df1 和 200 行 df2 , 稍微修改 nicola 的答案以获得所需的输出(两个函数都给出相同的结果,除了需要 as.numeric nicola 的):

所以:
set.seed(17)
df1 <- data.frame(replicate(3,sample(1:100,100000,rep=TRUE)))
df2 <- data.frame(df1[sample(nrow(df1),200), ])

nicola <- function(){x<-match(do.call(paste,df1),do.call(paste,df2), nomatch=0)}

cath <- function(){
dt1 <-data.table(df1); dt1[, ori:=.I]
dt2 <- data.table(df2); dt2[, ind_df2:=.I]
setkey(dt1, X1, X2, X3)
setkey(dt2, X1, X2, X3)
x <- dt2[dt1, ind_df2]
x[is.na(x)] <- 0
x <- x[order(dt1$ori)]
x
}

Frank <- function(){dt1 <-data.table(df1);dt2 <- data.table(df2); setkey(setDT(dt2)[,ii:=.I],X1,X2,X3); x <- dt2[dt1]$ii;x[is.na(x)] <- 0}

require(microbenchmark)
microbenchmark(cath(), Frank(), nicola(), unit="relative", times=100)
#Unit: relative
# expr min lq mean median uq max neval cld
#Frank() 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 100 a
# cath() 3.238195 3.099896 2.438342 2.767165 2.177365 1.447397 100 b
#nicola() 13.127820 12.476996 8.761549 10.899191 7.292086 2.783436 100 c

关于r - 提取数据帧的行索引,其条目对应于另一个数据帧的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31339923/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com