我有兩個資料框 A 和 B:
一個
x y
1 0.0 0.0000000
2 0.5 0.8000000
3 -0.5 0.8000000
4 -1.0 0.0000000
5 -0.5 -0.8000000
6 0.5 -0.8000000
7 1.0 0.0000000
8 1.5 0.8000000
乙
x y
1 -1.0 0.0000000
2 0.5 -0.8000000
3 3.0 0.0000000
我想只提取 B 中存在的 A 中的行索引,以便最終結果為:
c(4,6)
我該怎么做呢?
uj5u.com熱心網友回復:
向 A 添加另一列,這只是一個序列,然后合并
> A$c=1:nrow(A)
> merge(A,B)$c
[1] 4 6
uj5u.com熱心網友回復:
interaction
可用于%in%
在多個列上使用。
which(interaction(A) %in% interaction(B))
#[1] 4 6
資料
A <- read.table(header=TRUE, text=" x y
1 0.0 0.0000000
2 0.5 0.8000000
3 -0.5 0.8000000
4 -1.0 0.0000000
5 -0.5 -0.8000000
6 0.5 -0.8000000
7 1.0 0.0000000
8 1.5 0.8000000")
B <- read.table(header=TRUE, text=" x y
1 -1.0 0.0000000
2 0.5 -0.8000000
3 3.0 0.0000000")
uj5u.com熱心網友回復:
使用join.keys
來自的函式plyr
:
library(plyr)
with(join.keys(A, B), which(x %in% y))
輸出:
[1] 4 6
uj5u.com熱心網友回復:
一種可能的方法是計算 TRUE 出現兩次的次數。如果列變得更寬,您可以映射它們。
which(` `(df1$x %in% df2$x, df1$y %in% df2$y) == 2)
4 6
uj5u.com熱心網友回復:
使用outer
which(rowSums(outer(1:nrow(A), 1:nrow(B), Vectorize(\(i, j) all(A[i, ] == B[j, ])))) == 1)
# [1] 4 6
或for
回圈
r <- c()
for (j in seq_len(nrow(B))) {
for (i in seq_len(nrow(A))) {
if (all(A[i, ] == B[j, ])) r <- c(r, i)
}
}
r
# [1] 4 6
uj5u.com熱心網友回復:
library(data.table)
setDT(A)
setDT(B)
A[fintersect(A, B), on = names(A), which = TRUE]
# [1] 4 6
library(dplyr)
A |>
mutate(row = row_number()) |>
inner_join(B, by = names(A)) |>
pull(row)
# [1] 4 6
資料
A = data.frame(
x = c(0, 0.5, -0.5, -1, -0.5, 0.5, 1, 1.5),
y = c(0, 0.8, 0.8, 0, -0.8, -0.8, 0, 0.8))
B = data.frame(
x = c(-1, 0.5, 3), y = c(0, -0.8, 0)
)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/496595.html
標籤:r
上一篇:根據相應列中的某些條件排除行