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)
我期望的输出是:
- 字符串 黑色 白色 西班牙裔 其他
- 22;2 真假真假
- 20 假真假假
- 40;20 假真假真
- 2 真假假假假
感谢您的帮助!
我不是很清楚你的预期输出,但也许下面是你想要的。
想法是将 number
和 newcol
之间的映射存储在 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
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)
我期望的输出是:
- 字符串 黑色 白色 西班牙裔 其他
- 22;2 真假真假
- 20 假真假假
- 40;20 假真假真
- 2 真假假假假
感谢您的帮助!
我不是很清楚你的预期输出,但也许下面是你想要的。
想法是将 number
和 newcol
之间的映射存储在 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