R- 使用 grepl 搜索模式并生成多个二进制变量

R- Using grepl search for a pattern and generate multiple binary variables

B运行d 是 R 和堆栈的新手。希望我问的这个问题是正确的。

我有许多字符串变量需要重新编码到唯一的列中。数据是从一项调查中收集的。例如,如果受访者选择“2-black”和“22-hispanic”,则数据在变量 "string" 中记录为“2;22”。

我需要将变量重新编码为具有 colnames 的唯一二进制变量:"Black"、"White"、"Hispanic" 等。列应填充为 "TRUE"或 "FALSE" 通过在字符串值中搜索数字模式。

我尝试使用 "grepl" 编写一个函数,但效果不佳。首先,我必须从数据框(不包括代码)创建一个对象 "string"。然后我 运行 遇到了区分“2”和“22”的问题。

如果您运行下面的代码,您会发现它没有按预期工作

    strg_to_many<-function(newcol, string, number) {
    for (i in 1:length(number)){
    string<-newcol[I]
    df_temp[string]<-grepl(number[i], df_temp$string)
      }
    return(df_temp)
     }

    df_temp<-data.frame(string=c("22;2", "20", "40,20", "2"))
    newcol<-c("black" , "white", "hispanic", "other")
    number<-c("2", "20", "22", "40")
    string<-c("22;2", "20", "40;20", "2")

    df <- strg_to_many(newcol, string, number)

我期望的输出是:

感谢您的帮助!

我不是很清楚你的预期输出,但也许下面是你想要的。

想法是将 numbernewcol 之间的映射存储在 data.frame 中,然后在将条目与 string 分开后执行 left_join

请注意,这假设 string 中的第一个数字是属于 newcol 的数字。

df_map <- data.frame(
    number = number,
    newcol = newcol)

library(tidyverse)
df_temp %>%
    separate(string, c("x1", "x2"), remove = FALSE, fill = "right") %>%
    left_join(df_map, by = c("x1" = "number")) %>%
    mutate(val = TRUE) %>%
    spread(newcol, val, fill = FALSE) %>%
    select(-x1, -x2)
#  string black hispanic other white
#1      2  TRUE    FALSE FALSE FALSE
#2     20 FALSE    FALSE FALSE  TRUE
#3   22;2 FALSE     TRUE FALSE FALSE
#4  40,20 FALSE    FALSE  TRUE FALSE

更新

针对您的说明,以下内容似乎重现了您的预期输出

df_temp %>%
    rowid_to_column("row") %>%
    mutate(tmp = str_split(string, "[;,]")) %>%
    unnest() %>%
    left_join(df_map, by = c("tmp" = "number")) %>%
    mutate(val = TRUE) %>%
    select(-tmp) %>%
    spread(newcol, val, fill = FALSE) %>%
    select(-row)
#  string black hispanic other white
#1   22;2  TRUE     TRUE FALSE FALSE
#2     20 FALSE    FALSE FALSE  TRUE
#3  40,20 FALSE    FALSE  TRUE  TRUE
#4      2  TRUE    FALSE FALSE FALSE