假设我有两个数据框:
A <- data.frame("SerialNum" = integer(), "Year" = integer(), stringsAsFactors = F)
A[1,] <- c(93843, 2001)
A[2,] <- c(12458, 2007)
A[3,] <- c(11112, 2000)
A[4,] <- c(18293, 2013)
A[5,] <- c(81203, 2014)
A[6,] <- c(11112, 2001)
A[7,] <- c(11112, 2013)
A[8,] <- c(11112, 2014)
B <- data.frame("SerialNum" = integer(), "Year" = integer(), stringsAsFactors= F)
B[1:3,] <- rbind(c(11112, 2000), c(18293, 2013),c(81203, 2014))
B[4,] <- c(48639, 2012)
B[5,] <- c(00128, 2003)
B[6,] <- c(67942, 2005)
我想要做的是创建新的数据框:A_Match
,其中包含A
共同的所有条目B
和B_Match
所有条目与B
共同的A
条目。使用for循环执行此操作非常简单,但对于我的实际数据来说速度太慢。我的数据的棘手部分是不同的年份可能包含相同的序列号,因此我必须检查序列号和年份,以便正确地对我的数据进行子集化。什么是面向对象的方式在R中执行此操作?我不确定哪些功能可以帮助我完成这项任务。我的for循环是
L_A <- nrow(A)
L_B <- nrow(B)
A_Inds <- integer()
B_Inds <- integer()
for (i in 1:L_A){
IncNums <- which(B$SerialNum == A$SerialNum[i])
YNums <- which(B$Year == A$Year[i])
B_Inds <- union(B_Inds, intersect(IncNums, YNums))
}
for (i in 1:L_B){
IncNums <- which(A$SerialNum == B$SerialNum[i])
YNums <- which(A$Year == B$Year[i])
A_Inds <- union(A_Inds, intersect(IncNums, YNums))
}
A_Match <- A[unique(A_Inds),]
B_Match <- B[unique(B_Inds),]
答案 0 :(得分:2)
您可以使用%in%
检查另一个数据框中的每个序列号是否存在,然后使用标准行索引来限制匹配:
(A_Match <- A[A$SerialNum %in% B$SerialNum,])
# SerialNum Year
# 3 11112 2000
# 4 18293 2013
# 5 81203 2014
(B_Match <- B[B$SerialNum %in% A$SerialNum,])
# SerialNum Year
# 1 11112 2000
# 2 18293 2013
# 3 81203 2014
答案 1 :(得分:0)
我相信这也是等价的,对大型数据集可能效果更好:
library(dplyr)
semi_join(A,B)