R没有For循环的子集数据

时间:2015-09-23 18:25:22

标签: r

假设我有两个数据框:

    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共同的所有条目BB_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),]

2 个答案:

答案 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)