如何检查r中不同列长的大数据框中是否存在一行
我试图匹配数据帧中的一行值是否匹配,但%in%函数似乎无法正常工作 以下是一个例子:如何检查r中不同列长的大数据框中是否存在一行,r,match,R,Match,我试图匹配数据帧中的一行值是否匹配,但%in%函数似乎无法正常工作 以下是一个例子: > c a b 1 1 2 > d a b 1 1 1 > g a b f 1 1 1 1 2 2 2 2 3 3 3 3 我是否可以检查大数据帧g中是否存在一行,并打印d行为TRUE,c行为FALSE 为方便起见,以下是示例数据代码: a<-1;b<-2;c<-data.frame(a,b);a<-1;b<-1;d<-data.frame
> c
a b
1 1 2
> d
a b
1 1 1
> g
a b f
1 1 1 1
2 2 2 2
3 3 3 3
我是否可以检查大数据帧g中是否存在一行,并打印d行为TRUE,c行为FALSE
为方便起见,以下是示例数据代码:
a<-1;b<-2;c<-data.frame(a,b);a<-1;b<-1;d<-data.frame(a,b);a<-c(1,2,3);b<-c(1,2,3);f<-c(1,2,3);g<-data.frame(a,b,f)
我们可以粘贴行,然后在%中执行%
我们可以粘贴行,然后在%中执行%
我们可以创建一个函数,使用dplyr包中的intersect来比较数据帧 在本例中,dt2是比dt1具有更多列的数据帧
我们可以创建一个函数,使用dplyr包中的intersect来比较数据帧 在本例中,dt2是比dt1具有更多列的数据帧
谢谢你的回答,它非常有效,你能解释一下方法吗?我认为不同列长度的数据是不可比较的。@Y.Z.根据您的帖子,比较是在一行数据集和多行数据集之间进行的,即“g”。在do.callpaste中,将每行的元素粘贴在一起,创建一个字符串do.callpaste,c[1]1 2,并与“g”中的类似字符串进行比较,即do.callpaste,g[namesc][1]1 2 3。现在,我们比较的是两个向量,而不是data.frame。由于在%in%`%的lhs上有一个元素,它根据该元素在另一个中是否存在返回FALSE/TRUEvector@Y.Z.假设“g”包含来自“c”和“c”的列,我们用g[namesd]或g[namesc]@Y.Z来子集“g”数据集。namesc或namesd是“c”和“d”的列名。因此,如果我们假设这些列存在于“g”中,那么我们将只使用这些列对“g”数据集进行子集设置。我想你明白我的意思了,现在一切都有意义了。再次感谢您的回答和随后的解释!谢谢你的回答,它非常有效,你能解释一下方法吗?我认为不同列长度的数据是不可比较的。@Y.Z.根据您的帖子,比较是在一行数据集和多行数据集之间进行的,即“g”。在do.callpaste中,将每行的元素粘贴在一起,创建一个字符串do.callpaste,c[1]1 2,并与“g”中的类似字符串进行比较,即do.callpaste,g[namesc][1]1 2 3。现在,我们比较的是两个向量,而不是data.frame。由于在%in%`%的lhs上有一个元素,它根据该元素在另一个中是否存在返回FALSE/TRUEvector@Y.Z.假设“g”包含来自“c”和“c”的列,我们用g[namesd]或g[namesc]@Y.Z来子集“g”数据集。namesc或namesd是“c”和“d”的列名。因此,如果我们假设这些列存在于“g”中,那么我们将只使用这些列对“g”数据集进行子集设置。我想你明白我的意思了,现在一切都有意义了。再次感谢您的回答和随后的解释!
do.call(paste, c) %in% do.call(paste, g[names(c)])
#[1] FALSE
do.call(paste, d) %in% do.call(paste, g[names(d)])
#[1] TRUE
is.match <- function(dt1, dt2){
temp <- dplyr::intersect(dt1, dt2[, names(dt1)])
if (nrow(temp) == 0){
return(FALSE)
} else {
return(TRUE)
}
}
is.match(c, g)
# [1] FALSE
is.match(d, g)
# [1] TRUE