R语言 新变量,条件是df1列值是否等于特定df2列中包含的任何值

ecfdbz9o  于 2023-02-10  发布在  其他
关注(0)|答案(2)|浏览(121)

我尝试使用mutate()创建一个新变量。在df1中,我在col1、col2、col3和col4中有取值范围。我想在df1中创建一个新的二进制变量,该变量为"1"IF在特定的df2列(比如col10)中找到col1 - 4中的任何一个值。
谢谢!
到目前为止,我已经尝试过这种方法,但我不认为它会为所有匹配的值返回值"1",只会为其中一些值返回值"1"。

df1 %>%
  mutate(newvar = case_when(
    col1 == df2$col10 | col2 == df2$col10 | col3 == df2$col10 | col4 == df2$col10 ~ 1
  ))
ruarlubt

ruarlubt1#

这里我们可以使用if_any,如果行数相同,则使用==代替%in%进行元素间比较

library(dplyr)
df1 %>% 
   mutate(newvar = +(if_any(col1:col4,  ~.x %in% df2$col10)))
zqdjd7g9

zqdjd7g92#

首先,让我们创建一些虚拟数据。df1有4列,df2有一个名为col10的列。在虚拟数据中,第1、2、3和5行在df2$col10中有匹配项。

library(dplyr)
df1 <- data.frame(col1 = 1:5, col2=3:7, col3=5:9, col4=10:14)

df2 <- data.frame(col10 = c(1,2,3,14))

我们可以使用rowwise()在每一行中进行计算,然后使用c_across()来识别感兴趣的变量,代码识别四列中的值是否在df2$col10中,并返回一个逻辑值,as.numeric()将该逻辑值转换为0(FALSE)和1(TRUE)。

df1 %>% 
  rowwise() %>% 
  mutate(newvar = as.numeric(any(c_across(col1:col4) %in% df2$col10)))
#> # A tibble: 5 × 5
#> # Rowwise: 
#>    col1  col2  col3  col4 newvar
#>   <int> <int> <int> <int>  <dbl>
#> 1     1     3     5    10      1
#> 2     2     4     6    11      1
#> 3     3     5     7    12      1
#> 4     4     6     8    13      0
#> 5     5     7     9    14      1

reprex package(v2.0.1)于2023年2月9日创建

相关问题