比较R中2个不同数据帧中的多列



我正在尝试比较R中两个不同数据帧中的多个列。这一点以前在论坛上已经讨论过(比较两列的组并返回与R匹配的索引(,但这是一个不同的场景:我正在试着比较dataframe 1中的列是否在dataframe 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

预期结果:

  1. 比较temp1.df$cyl和temp2.df$cyl。如果它们匹配,则-->
  2. 检查temp1.df$mpg是否介于temp2.df$Start和temp2.df$End之间-->
  3. 如果是,则创建一个值为1的新变量newmpg

此处很难显示确切的预期输出。

我意识到我可以循环这一点,所以对于temp1.df的每一行,但原始的temp2.df有超过250000行。一个有效的解决方案将不胜感激。

感谢

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计数的第二个数据集的子集进行比较。在该子集内,它检查该行的mpg的any是否落在between(来自dplyr(StartEnd,如果是则返回1(如果否则返回0(。然后,所有这些1和0都作为(命名的(向量返回,该向量可以放入temp1.df$new_mpg中。

我猜rowwise有办法做到这一点,但我永远无法让它正常工作。。。

相关内容

  • 没有找到相关文章

最新更新