【问题标题】:R- Using grepl search for a pattern and generate multiple binary variablesR- 使用 grepl 搜索模式并生成多个二进制变量
【发布时间】:2019-08-07 23:39:38
【问题描述】:

全新的 R 和堆栈。希望我问的这个问题是正确的。

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

我需要将变量重新编码为唯一的二进制变量,其名称为:“Black”、“White”、“Hispanic”等。应通过在字符串值。

我尝试使用“grepl”编写函数,但效果不佳。首先,我必须从数据框中创建一个对象“字符串”(不包括代码)。然后我遇到了区分“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)

我期望的输出是:

  • 字符串黑色白色西班牙裔其他
  • 22;2 真假真假
  • 20 FALSE TRUE FALSE FALSE
  • 40;20 假真假真
  • 2 真假假假

感谢您的帮助!

【问题讨论】:

  • 您希望40,20 发生什么?那会是Other == TRUEwhite == TRUE 吗?在两个数字的情况下,它们是如何分开的?在您的示例中,您似乎同时有分号和逗号。如果您要为您提供的样本数据(不仅仅是一行)提供完整的预期输出,这将有所帮助。
  • 我的错误,对不起。它们应该用“;”分隔

标签: r string grepl


【解决方案1】:

我对您的预期输出并不完全清楚,但也许以下就是您所追求的。

想法是将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

【讨论】:

  • 非常感谢,莫里茨!我觉得这更接近了。我确实需要评估字符串中的所有信息。因此,对于第 3 行,我还希望“黑色”为“真”,因为“2”得到认可。在第 4 行中,我希望“其他”为“真”,因为“20”得到认可。这有意义吗?
  • 抱歉,我没有看到您最初的问题。它们应该用“;”分隔
  • 嗨@KateMcDonald。我进行了编辑;这就是你所追求的吗(在这种情况下仍然不太清楚你所说的“认可”是什么意思)。
  • 不用担心@KateMcDonald;很高兴它有帮助。
猜你喜欢
  • 1970-01-01
  • 2014-12-01
  • 2020-10-20
  • 2021-10-23
  • 2022-01-07
  • 2020-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多