R 从具有多个值的字符串创建虚拟变量
我有一个数据集,其中的一列包含多个值,用a;分隔 我想为good_中的每个唯一值创建一个虚拟变量,这样每个虚拟变量都包含一个TRUE或FALSE,以指示该个体是否拥有该特定值 期望输出R 从具有多个值的字符串创建虚拟变量,r,reshape,dummy-variable,one-hot-encoding,R,Reshape,Dummy Variable,One Hot Encoding,我有一个数据集,其中的一列包含多个值,用a;分隔 我想为good_中的每个唯一值创建一个虚拟变量,这样每个虚拟变量都包含一个TRUE或FALSE,以指示该个体是否拥有该特定值 期望输出 我创建了一个函数,可以提供所需的输出: dum <- function(kw, col, type=c(T, F)) { t <- as.data.frame(grep(as.character(kw), col, ignore.case=T)) t$one <- type[1] colname
我创建了一个函数,可以提供所需的输出:
dum <- function(kw, col, type=c(T, F)) {
t <- as.data.frame(grep(as.character(kw), col, ignore.case=T))
t$one <- type[1]
colnames(t) <- c("col1","dummy")
t2 <- as.data.frame(grep(as.character(kw), col, ignore.case=T,
invert=T))
t2$zero <- type[2]
colnames(t2) <- c("col1","dummy")
t3<-rbind(t, t2)
t3<-t3[order(t3$col1), ]
return(t3$dummy)
}
概述
要在需要时为good_中的每个唯一值创建虚拟变量,请执行以下步骤:
将好的文件分为多行
为每个名称性别对的good_at中的每个值生成虚拟变量-using
将数据重塑为4列:名称、性别、键和值
键包含所有虚拟变量列名
值包含每个虚拟变量中的值
仅保留值不为零的记录
将数据重塑为每个姓名性别对的一条记录,并按键中的列数调整数据
将虚拟列强制转换为逻辑向量。
密码
我需要解决的问题是,现有变量包含多个信息,例如绘图+爬山。我必须在google sheet中使用类似REGEXMATCH的函数,但我现在不知道如何在R@CristianE.NunoAh中编码。你的问题不一样。感谢您的澄清。此函数适用于前三列,但第四列和后一列不起作用,它显示:$Error in$如果出现该错误,则表示您搜索的关键字不显示在该列中。
Drawing Cooking
True False
False True
False False
False False
dum <- function(kw, col, type=c(T, F)) {
t <- as.data.frame(grep(as.character(kw), col, ignore.case=T))
t$one <- type[1]
colnames(t) <- c("col1","dummy")
t2 <- as.data.frame(grep(as.character(kw), col, ignore.case=T,
invert=T))
t2$zero <- type[2]
colnames(t2) <- c("col1","dummy")
t3<-rbind(t, t2)
t3<-t3[order(t3$col1), ]
return(t3$dummy)
}
Drawing <- dum("drawing", df$Good_at)
> Drawing
TRUE
FALSE
...
Cooking <- dum("cooking", df$Good_at)
> Cooking
FALSE
TRUE
...
# load necessary packages ----
library(dummy)
library(tidyverse)
# load necessary data ----
df <-
read.table(text = "name sex good_at
1 Tom M Drawing;Hiking
2 Mary F Cooking;Joking
3 Sam M Running
4 Charlie M Swimming"
, header = TRUE
, stringsAsFactors = FALSE)
# create a longer version of df -----
# where one record represents
# one unique name, sex, good_at value
df_clean <-
df %>%
separate_rows(good_at, sep = ";")
# create dummy variables for all unique values in "good_at" column ----
df_dummies <-
df_clean %>%
select(good_at) %>%
dummy() %>%
bind_cols(df_clean) %>%
# drop "good_at" column
select(-good_at) %>%
# make the tibble long by reshaping it into 4 columns:
# name, sex, key and value
# where key are the all dummy variable column names
# and value are the values in each dummy variable
gather(key, value, -name, -sex) %>%
# keep records where
# value is not equal to zero
# note: this is due to "Tom" having both a
# "good_at_Drawing" value of 0 and 1.
filter(value != 0) %>%
# make the tibble wide
# with one record per name-sex pair
# and as many columns as there are in key
# with their values from value
# and filling NA values to 0
spread(key, value, fill = 0) %>%
# for each name-sex pair
# cast the dummy variables into logical vectors
group_by(name, sex) %>%
mutate_all(funs(as.integer(.) %>% as.logical())) %>%
ungroup() %>%
# just for safety let's join
# the original "good_at" column
left_join(y = df, by = c("name", "sex")) %>%
# bring the original "good_at" column to the left-hand side
# of the tibble
select(name, sex, good_at, matches("good_at_"))
# view result ----
df_dummies
# A tibble: 4 x 9
# name sex good_at good_at_Cooking good_at_Drawing good_at_Hiking
# <chr> <chr> <chr> <lgl> <lgl> <lgl>
# 1 Char… M Swimmi… FALSE FALSE FALSE
# 2 Mary F Cookin… TRUE FALSE FALSE
# 3 Sam M Running FALSE FALSE FALSE
# 4 Tom M Drawin… FALSE TRUE TRUE
# ... with 3 more variables: good_at_Joking <lgl>, good_at_Running <lgl>,
# good_at_Swimming <lgl>
# end of script #