R:根据一列值在另一列中的存在生成虚拟变量

R: Generate a dummy variable based on the existence of one column' value in another column

我有这样一个数据框:

A                    B          
2012,2013,2014     2011
2012,2013,2014     2012
2012,2013,2014     2013
2012,2013,2014     2014
2012,2013,2014     2015

我想创建一个虚拟变量,它表示B列中的值是否存在于A列中。1表示存在,0表示不存在。这样,

A                    B       dummy        
2012,2013,2014     2011        0
2012,2013,2014     2012        1
2012,2013,2014     2013        1
2012,2013,2014     2014        1
2012,2013,2014     2015        0

我已经尝试使用 %in% 来实现这个:

df$dummy <- ifelse(df$B %in% df$A, 1, 0)

但结果dummy栏中的所有内容都是1

当我尝试使用另一种方法时发生了同样的情况any():

df$dummy <- any(df$A==df$B)

dummy 列中的所有内容都是 TRUE

有没有一种有效的方法来生成这个虚拟变量?

非常感谢!

看起来 A 列是一串用逗号分隔的数字,因此 %in% 不合适(例如,如果您检查 B 在多个字符串的向量中,如果 AB 是数字,则为数字)。如果您的数据框架结构不同,请告诉我(并随时编辑您的问题)。

您可能可以通过多种方式完成此操作。也许一种简单的方法是一次使用 grepl 一行来确定列 B 是否存在于 A 中。

library(tidyverse)

df %>%
  rowwise() %>%
  mutate(dummy = +grepl(B, A))

输出

# A tibble: 5 x 3
  A              B     dummy
  <fct>          <fct> <int>
1 2012,2013,2014 2011      0
2 2012,2013,2014 2012      1
3 2012,2013,2014 2013      1
4 2012,2013,2014 2014      1
5 2012,2013,2014 2015      0

数据

df <- data.frame(
  A = c(rep("2012,2013,2014", 5)),
  B = c("2011", "2012", "2013", "2014", "2015")
)

如果你想使用 base R:

df <- data.frame(A = rep("2012,2013,2014", 5), B = c("2011", "2012","2013","2014","2015"))

for(i in 1:nrow(df)){
     df$dummy[i] <- grepl(df$B[i],df$A[i])
}

制作制表符分隔文件:

A   B          
2012,2013,2014  2011
2012,2013,2014  2012
2012,2013,2014  2013
2012,2013,2014  2014
2012,2013,2014  2015

这是使用 stringr 中的 str_detect 的方法:

read.table('test.txt', header = TRUE) %>% 
  mutate(
    B = as.character(B),
    dummy = case_when(
      str_detect(pattern = B, fixed(A)) ~ '1',
      TRUE ~ '0'
    )
  )

这是另一个使用 tidyverse 的解决方案。主要问题是 A 被读取为字符串。我的解决方案首先将每个数字分成不同的列,然后将 B 与这些数字进行比较。

library(tidyverse)

df %>%
  #Separate A into separate numbers
  separate(col = A,
           sep = ",",
           into = c("S1","S2","S3")) %>%
  #Compare B to the new columns and fill dummy
  mutate(dummy = ifelse(B %in% c(S1,S2,S3), 1, 0))