R 从具有多个值的字符串创建虚拟变量

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

我有一个数据集,其中的一列包含多个值,用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]
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 #