[英]Compare multiple columns in 2 different dataframes in R
我正在尝试比较 R 中两个不同数据帧中的多个列。这在之前的论坛上已经解决( 比较两列的组并返回索引匹配 R )但这是一个不同的场景:我试图比较列是否在dataframe 1
位于dataframe 2
的 2 列范围之间。 match, merge, join, intersect
等功能在这里不起作用。 我一直在尝试使用purr::pluck
但没有走多远。 数据帧具有不同的大小。
下面是一个例子:
temp1.df <- mtcars
temp2.df <- data.frame(
Cyl = sample (4:8, 100, replace = TRUE),
Start = sample (1:22, 100, replace = TRUE),
End = sample (1:22, 100, replace = TRUE)
)
temp1.df$cyl <- as.character(temp1.df$cyl)
temp2.df$Cyl <- as.character(temp2.df$Cyl)
我的尝试:
temp1.df <- temp1.df %>% mutate (new_mpg = case_when (
temp1.df$cyl %in% temp2.df$Cyl & temp2.df$Start <= temp1.df$mpg & temp2.df$End >= temp1.df$mpg ~ 1
))
错误:
Error in mutate_impl(.data, dots) :
Column `new_mpg` must be length 32 (the number of rows) or one, not 100
预期结果:
- 比较 temp1.df$cyl 和 temp2.df$Cyl。 如果它们匹配,则 -->
- 检查 temp1.df$mpg 是否在 temp2.df$Start 和 temp2.df$End 之间 -->
- 如果是,则创建一个值为 1 的新变量 new_mpg。
在这里很难显示确切的预期输出。
我意识到我可以为temp1.df
每一行循环这个,但原始temp2.df
有超过 250,000 行。 一个有效的解决方案将不胜感激。
谢谢
temp1.df$new_mpg<-apply(temp1.df, 1, function(x) {
temp<-temp2.df[temp2.df$Cyl==x[2],]
ifelse(any(apply(temp, 1, function(y) {
dplyr::between(as.numeric(x[1]),as.numeric(y[2]),as.numeric(y[3]))
})),1,0)
})
请注意,这对实际数据的组织做出了一些假设(特别是,我无法调用apply
的列名,因此我使用了索引 - 这可能会发生很大变化,因此您可能想要重新排列数据在接收它和调用apply
,或者可能在apply
改变它的组织,例如,通过apply(temp1.df[,c("mpg","cyl")]...
。
无论如何,这会将您的数据集分成几行,并将每一行与具有相同 Cyl 计数的第二个数据集的子集进行比较。 在这个子集,它会检查是否any
的MPG此行的下降between
(从dplyr
) Start
和End
,并返回1,如果是(或者0,如果没有)。 然后所有这些 1 和 0 作为(命名)向量返回,可以放入temp1.df$new_mpg
。
我猜有一种方法可以用rowwise
做到这rowwise
,但我永远无法让它正常工作......
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.