【发布时间】:2019-03-23 17:45:20
【问题描述】:
我目前正在尝试找出一种矢量化方式来匹配同一行中的两个值。我有以下两个简化的数据框:
# Dataframe 1: Displaying all my observations
df1 <- data.frame(c(1, 2, 3, 4, 5, 6, 7, 8),
c("A", "B", "C", "D", "A", "B", "A", "C"),
c("B", "E", "D", "A", "C", "A", "D", "A"))
colnames(df1) <- c("ID", "Number1", "Number2")
> df1
ID Number1 Number2
1 1 A B
2 2 B E
3 3 C D
4 4 D A
5 5 A C
6 6 B A
7 7 A D
8 8 C A
# Dataframe 2: Matrix of observations I am interested in
df2 <- matrix(c("A", "B",
"D", "A",
"C", "B",
"E", "D"),
ncol = 2,
byrow = TRUE)
> df2
[,1] [,2]
[1,] "A" "B"
[2,] "D" "A"
[3,] "C" "B"
[4,] "E" "D"
我想要完成的是在 df1 中创建一个新列,仅当 df2 中存在确切组合时才声明 TRUE(例如 ID = 1 等同于 df2 中的第一行,因为它们都包含 A和 B)。此外,如果有快捷方式,如果数字反转,我也希望状态为 TRUE,即 df1$Number1 匹配 df2[i,2] 并且 df1$Number2 匹配 df2[i,1] (例如对于 ID = 7,df1中的组合为A,D,df2中的组合为D,A --> TRUE)。
我想要的输出如下所示:
> df1
ID Number1 Number2 Status
1 1 A B TRUE
2 2 B E FALSE
3 3 C D FALSE
4 4 D A TRUE
5 5 A C FALSE
6 6 B A TRUE
7 7 A D TRUE
8 8 C A FALSE
到目前为止,我得到的只是:
for (i in 1:nrow(df1)) {
for (j in 1:nrow(df2)) {
Status <- ifelse(df1$Number1[i] %in% df2[j,1] &&
df1$Number2[i] %in% df2[j,2], TRUE, FALSE)
StatusComb[i,j] <- Status
}
df1$Status[i] <- ifelse(any(StatusComb[i,]) == TRUE, TRUE, FALSE)
}
它的效率真的很低(你可以清楚地告诉我我是 R 新手)而且看起来也不是很好。我将不胜感激!
【问题讨论】: