R - 如何比较两个数据帧的行和 return 每个案例的相同值的计数
R - how to compare rows of two data frames and return the count of identical values for each case
我是 R 的新手,需要你的帮助。我有两个数据框:dat1
和 dat2
.
dat1 <- data.frame(X1 = c(9, 21, 30), X2 = c(3, 25, 47), X3 = c(13, 26, 51))
dat2 <- data.frame(X1 = c(3, 21, 30), X2 = c(7, 19, 47), X3 = c(13, 35, 51))
dat1
X1 X2 X3
1 9 3 13
2 21 25 26
3 30 47 51
dat2
X1 X2 X3
1 3 7 13
2 21 19 35
3 30 47 51
我想要的是将 dat1
的每一行中的值与所有 dat2
行和 return 语句中的值或每个匹配值的数量进行比较案件。像这样:
dat1 row 1 and dat2 row 1: 2 match
dat1 row 1 and dat2 row 2: 0 match
dat1 row 1 and dat2 row 3: 0 match
dat1 row 2 and dat2 row 1: 0 match
dat1 row 2 and dat2 row 2: 1 match
dat1 row 2 and dat2 row 3: 0 match
...
希望您理解我的想法。声明不必这么长。我只想了解如何对两个数据框进行此类比较。
谢谢!
试试下面的代码片段:
for(I in 1:3){
for(J in 1:3){
print(sum(dat1[I,] %in% dat2[J,]))
}
}
如果可以走矩阵格式,那么
myfun <- Vectorize(function(a, b) sum(dat1[a,] %in% dat2[b,]), vectorize.args = c("a", "b"))
outer(seq_len(nrow(dat1)), seq_len(nrow(dat2)), myfun)
# [,1] [,2] [,3]
# [1,] 2 0 0
# [2,] 0 1 0
# [3,] 0 0 3
如果您更喜欢垂直的性质:
eg <- expand.grid(a = seq_len(nrow(dat1)), b = seq_len(nrow(dat2)))
eg$in_common <- with(eg, myfun(a, b))
eg
# a b in_common
# 1 1 1 2
# 2 2 1 0
# 3 3 1 0
# 4 1 2 0
# 5 2 2 1
# 6 3 2 0
# 7 1 3 0
# 8 2 3 0
# 9 3 3 3
下面是 expand.grid
和 apply
的简单方法,它计算 dat1
和 dat2
行之间的匹配项数,而不考虑顺序:
result <-
apply(expand.grid(seq(1,nrow(dat1)),seq(1,nrow(dat2))), 1,
function(x){data.frame(dat1 = x[1], dat2 = x[2],
matches = (ncol(dat1) + ncol(dat2)) -
length(unique(c(dat1[x[1],],dat2[x[2],]))))
})
result <- do.call(rbind,result)
result
# dat1 dat2 matches
#Var1 1 1 2
#Var11 2 1 0
#Var12 3 1 0
#Var13 1 2 0
#Var14 2 2 1
#Var15 3 2 0
#Var16 1 3 0
#Var17 2 3 0
#Var18 3 3 3
我是 R 的新手,需要你的帮助。我有两个数据框:dat1
和 dat2
.
dat1 <- data.frame(X1 = c(9, 21, 30), X2 = c(3, 25, 47), X3 = c(13, 26, 51))
dat2 <- data.frame(X1 = c(3, 21, 30), X2 = c(7, 19, 47), X3 = c(13, 35, 51))
dat1
X1 X2 X3
1 9 3 13
2 21 25 26
3 30 47 51
dat2
X1 X2 X3
1 3 7 13
2 21 19 35
3 30 47 51
我想要的是将 dat1
的每一行中的值与所有 dat2
行和 return 语句中的值或每个匹配值的数量进行比较案件。像这样:
dat1 row 1 and dat2 row 1: 2 match
dat1 row 1 and dat2 row 2: 0 match
dat1 row 1 and dat2 row 3: 0 match
dat1 row 2 and dat2 row 1: 0 match
dat1 row 2 and dat2 row 2: 1 match
dat1 row 2 and dat2 row 3: 0 match
...
希望您理解我的想法。声明不必这么长。我只想了解如何对两个数据框进行此类比较。
谢谢!
试试下面的代码片段:
for(I in 1:3){
for(J in 1:3){
print(sum(dat1[I,] %in% dat2[J,]))
}
}
如果可以走矩阵格式,那么
myfun <- Vectorize(function(a, b) sum(dat1[a,] %in% dat2[b,]), vectorize.args = c("a", "b"))
outer(seq_len(nrow(dat1)), seq_len(nrow(dat2)), myfun)
# [,1] [,2] [,3]
# [1,] 2 0 0
# [2,] 0 1 0
# [3,] 0 0 3
如果您更喜欢垂直的性质:
eg <- expand.grid(a = seq_len(nrow(dat1)), b = seq_len(nrow(dat2)))
eg$in_common <- with(eg, myfun(a, b))
eg
# a b in_common
# 1 1 1 2
# 2 2 1 0
# 3 3 1 0
# 4 1 2 0
# 5 2 2 1
# 6 3 2 0
# 7 1 3 0
# 8 2 3 0
# 9 3 3 3
下面是 expand.grid
和 apply
的简单方法,它计算 dat1
和 dat2
行之间的匹配项数,而不考虑顺序:
result <-
apply(expand.grid(seq(1,nrow(dat1)),seq(1,nrow(dat2))), 1,
function(x){data.frame(dat1 = x[1], dat2 = x[2],
matches = (ncol(dat1) + ncol(dat2)) -
length(unique(c(dat1[x[1],],dat2[x[2],]))))
})
result <- do.call(rbind,result)
result
# dat1 dat2 matches
#Var1 1 1 2
#Var11 2 1 0
#Var12 3 1 0
#Var13 1 2 0
#Var14 2 2 1
#Var15 3 2 0
#Var16 1 3 0
#Var17 2 3 0
#Var18 3 3 3