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

R-使用grepl搜索模式并生成多个二进制变量,r,string,grepl,R,String,Grepl,对R和stack来说是全新的。希望我问得对 我有许多字符串变量需要重新编码到唯一的列中。这些数据是从一项调查中收集的。例如,如果受访者选择“2-黑人”和“22-西班牙裔”,则数据记录在变量“字符串”中为“2;22” 我需要将变量重新编码为唯一的二进制变量,其colname为:“Black”、“White”、“Hispanic”等。通过搜索字符串值中的数字模式,应将列填充为“TRUE”或“FALSE” 我试着用“grepl”编写一个函数,但是没有用。首先,我必须从数据帧中创建一个对象“string

对R和stack来说是全新的。希望我问得对

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

我需要将变量重新编码为唯一的二进制变量,其colname为:“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)

strg_to_many我不完全清楚您的预期输出,但以下可能是您的目标

其思想是将
number
newcol
之间的映射存储在
data.frame
中,然后在从
string
中分离条目后执行
left\u join

请注意,这假定
字符串中的第一个数字是属于
newcol
的数字


你认为
40,20
会发生什么?那是不是
Other==TRUE
&
white==TRUE
?对于两个数字,它们是如何分开的?在您的示例中,您似乎同时具有分号和逗号。如果您为您提供的示例数据提供完整的预期输出(而不仅仅是一行),这会有所帮助。对不起,我错了。他们应该用“;”隔开,非常感谢,毛里塔尼亚!我觉得这是非常非常接近的。我确实需要评估字符串中的所有信息。所以对于第3行,我也希望“black”是“TRUE”,因为“2”是背书的。在第4行中,我希望“Other”是“TRUE”,因为“20”是背书的。这有意义吗?抱歉,我没看到你最初的问题。它们之间应该用“;”Hi@KateMcDonald分隔。我做了一个编辑;这就是你想要的吗(仍然不太清楚你在这里所说的“认可”是什么意思);很高兴这有帮助。
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