R-使用grepl搜索模式并生成多个二进制变量
对R和stack来说是全新的。希望我问得对 我有许多字符串变量需要重新编码到唯一的列中。这些数据是从一项调查中收集的。例如,如果受访者选择“2-黑人”和“22-西班牙裔”,则数据记录在变量“字符串”中为“2;22” 我需要将变量重新编码为唯一的二进制变量,其colname为:“Black”、“White”、“Hispanic”等。通过搜索字符串值中的数字模式,应将列填充为“TRUE”或“FALSE” 我试着用“grepl”编写一个函数,但是没有用。首先,我必须从数据帧中创建一个对象“string”(不包括代码)。然后我遇到了区分,比如说,“2”和“22”的问题 如果您运行下面的代码,您可以看到它没有按预期工作R-使用grepl搜索模式并生成多个二进制变量,r,string,grepl,R,String,Grepl,对R和stack来说是全新的。希望我问得对 我有许多字符串变量需要重新编码到唯一的列中。这些数据是从一项调查中收集的。例如,如果受访者选择“2-黑人”和“22-西班牙裔”,则数据记录在变量“字符串”中为“2;22” 我需要将变量重新编码为唯一的二进制变量,其colname为:“Black”、“White”、“Hispanic”等。通过搜索字符串值中的数字模式,应将列填充为“TRUE”或“FALSE” 我试着用“grepl”编写一个函数,但是没有用。首先,我必须从数据帧中创建一个对象“string
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