R语言 比较两个不同数据框中的3列,并根据比较结果采取行动

n1bvdmb6  于 2023-02-10  发布在  其他
关注(0)|答案(1)|浏览(253)

我尝试比较两个不同数据框中的3列,并根据比较结果更新"标志"。
例如,

df_1 <- data.frame(x=seq(1,5,1),y=seq(1.5,5.5,1),z=LETTERS[1:5],Flag=0)

df_2 <- data.frame(l=c(1.2,10,3.2,5,5.2),k=c("A","F","P","D","E"))

如果df_2(col = l)的行式元素介于df_1(col = x,y)的行式元素之间,并且df_1(col = z)中的行式元素与df_2(col = k)的行式元素匹配,则flag更新为1,否则为0。因此,预期输出为

我的代码到目前为止:

df_1 %>% mutate(Flag=map_chr(
  .x=c(as.character(df_1$z),as.numeric(df_1$x),as.numeric(df_1$y)),
  .f= ~if_else(condition = all(.x == as.character(df_2$k) & x >= as.numeric(df_2$l)& x<=as.numeric(df_2$k)),true="1",false="0")
))

错误:mutate()中的错误:!计算Flag = map_chr(...)时出现问题。Flag的大小必须为5或1,而不是15。运行rlang::last_error()以查看错误发生的位置。有15个警告(使用warnings()查看它们)

warnings()

警告信息:1:计算Flag = map_chr(...)时出现问题。强制引入的NA 2:计算Flag = map_chr(...)时出现问题。强制3引入的NA:计算Flag = map_chr(...)时出现问题。强制引入的NAs ... 15次由于 Dataframe 相当大,我试图避免循环。
非常感谢@zephryl回答了我最初的问题(见上图)
这个问题的一个变体是:df_1中的一行将与df_2中的所有行进行比较,并且标志相应地"递增"。
例如,df_1

df_2

预期产出

先谢了!
由于 Dataframe 很大,我正在尝试避免循环
我已经用循环解决了

for(i in seq(1,nrow(df_1_new),1))
   {for(j in seq(1,nrow(df_2),1))
      {if(df_1_new$z[i] == df_2$k[j] & df_1_new$x[i] <= df_2$l[j] & 
       df_1_new$y[i] >= df_2$l[j])
          {df_1_new$Flag[i] = df_1_new$Flag[i]+1}}}

有没有更好的办法?

bkhjykvo

bkhjykvo1#

对于第一个问题,不需要使用map()或循环,您可以直接测试条件,这要归功于矢量化操作:

df_1$Flag <- ifelse(df_2$l >= df_1$x & df_2$l <= df_1$y & df_1$z == df_2$k, 1, 0)

或者,

df_1$Flag <- with(cbind(df_1, df_2), ifelse(l >= x & l <= y & z == k, 1, 0))

或者,

library(dplyr)

df_1 <- df_1 %>% 
  mutate(Flag = if_else(df_2$l >= x & df_2$l <= y & z == df_2$k, 1, 0))

所有3种方法的结果:

#> df_1
  x   y z Flag
1 1 1.5 A    1
2 2 2.5 B    0
3 3 3.5 C    0
4 4 4.5 D    0
5 5 5.5 E    1

对于第二个问题,可以使用purrr::pmap_dbl()df_1中迭代xyz(注意,我将df_2的第二个版本重命名为df_2_2,因为它具有不同的值)。

library(dplyr)
library(purrr)

df_1 %>% 
  mutate(Flag = pmap_dbl(
    list(x, y, z),
    \(x, y, z) sum(df_2_2$l >= x & df_2_2$l <= y & z == df_2_2$k)
  ))
x   y z Flag
1 1 1.5 A    2
2 2 2.5 B    0
3 3 3.5 C    2
4 4 4.5 D    0
5 5 5.5 E    0

相关问题