Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R-使用来自其他变量的字符串信息对新变量进行变异_R_Regex_String_Mutate - Fatal编程技术网

R-使用来自其他变量的字符串信息对新变量进行变异

R-使用来自其他变量的字符串信息对新变量进行变异,r,regex,string,mutate,R,Regex,String,Mutate,对于我的MSc论文,我正在整理R中的一个数据文件。在这个文件中,有一些字符串值不在正确的列中。我试图对它们进行排序,或者对新列进行变异,其中新列仅在与某个正则表达式匹配时接受字符串。让我告诉你我的意思。为了便于说明,我制作了以下数据帧。在这里,4个人被要求给出他们第一和第二喜欢的颜色和食物,或者如果他们只有一个最喜欢的(NA也是可能的)。但是,由于一些错误,答案在4列中混合 df <- data.frame(person_ = c("Peter", "Lucas", "Jake"

对于我的MSc论文,我正在整理R中的一个数据文件。在这个文件中,有一些字符串值不在正确的列中。我试图对它们进行排序,或者对新列进行变异,其中新列仅在与某个正则表达式匹配时接受字符串。让我告诉你我的意思。为了便于说明,我制作了以下数据帧。在这里,4个人被要求给出他们第一和第二喜欢的颜色和食物,或者如果他们只有一个最喜欢的(NA也是可能的)。但是,由于一些错误,答案在4列中混合

     df <- data.frame(person_ = c("Peter", "Lucas", "Jake", "Harry"), 
             note1 =c("1. Red", "2. Green", "1. Food: Hamburger", "1. Food: Pizza"), 
             note2 =c("1. Food: Pasta", "1. Blue", NA, "1. Yellow"),
             note3 =c("2. Food: Spaghetti", "2. Food: Chips", "1. Red", NA),
             note4 =c("2. Purple", "1. Food: Pancake", "2. White", NA))

df这里有一个解决方案,使用新的
tidyr
中的
pivot\u longer
pivot\u wide

dfnew<-df %>% pivot_longer(-person_, names_to="note",values_to="value") %>%
  mutate(note=gsub("(\\d)\\. (\\w*\\:)?.*","\\1 \\2",value), value=gsub("(\\d\\.) (\\w*\\:)? ?(.*)","\\3",value)) %>%
  filter(!is.na(value)) %>%
  pivot_wider(names_from = note, values_from = value, names_prefix = "fav")

dfnew
# A tibble: 4 x 5
  person_ `fav1 ` `fav1 Food:` `fav2 Food:` `fav2 `
  <fct>   <chr>   <chr>        <chr>        <chr>  
1 Peter   Red     Pasta        Spaghetti    Purple 
2 Lucas   Blue    Pancake      Chips        Green  
3 Jake    Red     Hamburger    NA           White  
4 Harry   Yellow  Pizza        NA           NA     
dfnew%pivot\u更长(-person\u,names\u to=“note”,values\u to=“value”)%>%
变异(注意=gsub(“(\\d)\\”(\\w*\\:)?*”,“\\1\\2”,value),value=gsub(“(\\d\”)(\\w*\\:)?(*”,“\\3”,value))%>%
过滤器(!is.na(值))%>%
枢轴(名称从=注释,值从=值,名称前缀=“fav”)
dfnew
#一个tibble:4x5
人fav1食品:`fav2食品:`fav2食品:`fav2`
1彼得红意大利面紫色意大利面
2卢卡斯蓝煎饼片绿色
3杰克红汉堡包NA白
4哈利黄色披萨娜娜
在列名方面仍有改进的余地,但这应该会让您在实现目标的过程中取得很大的进步

--

为了完整起见,这里提供了一个完整的解决方案,包括列名的自动化:

dfnew<-df %>% pivot_longer(-person_, names_to="note",values_to="value") %>%
  mutate(note=gsub("(\\d)\\. (\\w*\\:)?.*","\\1\\2",value), value=gsub("(\\d\\.) (\\w*\\:)? ?(.*)","\\3",value))
dfnew$note<-ifelse(!grepl(":",dfnew$note),paste0(dfnew$note,"colour"),dfnew$note)
dfnew2<-dfnew %>% mutate(note=tolower(gsub("(\\d)(\\w*)?:","\\1\\2",note))) %>%
  filter(!is.na(value)) %>%
  pivot_wider(names_from = note, values_from = value, names_prefix = "fav") %>%
  select(order(sapply(sapply(strsplit(names(.),""),rev),function(x) paste0(x,collapse=""))))


# A tibble: 4 x 5
  person_ fav1food  fav2food  fav1colour fav2colour
  <fct>   <chr>     <chr>     <chr>      <chr>     
1 Peter   Pasta     Spaghetti Red        Purple    
2 Lucas   Pancake   Chips     Blue       Green     
3 Jake    Hamburger NA        Red        White     
4 Harry   Pizza     NA        Yellow     NA    
dfnew%pivot\u更长(-person\u,names\u to=“note”,values\u to=“value”)%>%
变异(注意=gsub(“(\\d)\\”(\\w*\\:)?*”,“\\1\\2”,value),value=gsub(“(\\d\”)(\\w*\\:)?(*”,“\\3”,value))
新美元纸币%
过滤器(!is.na(值))%>%
pivot_加宽(名称自=注释,值自=值,名称自前缀=“fav”)%>%
选择(顺序(sapply(sapply(strsplit(名称(.),“”),版本),函数(x)paste0(x,collapse=”“))
#一个tibble:4x5
人uv1食品fav2食品fav1颜色fav2颜色
1彼得意大利面红紫色意大利面
2卢卡斯煎饼片蓝绿色
3杰克汉堡包NA红白
4哈利披萨拿黄色的拿

谢谢您的帮助。只需简单添加rename()即可完美运行:%%>%rename(“fav1_-color”=“fav1”、“fav2_-color”=“fav2”、“fav1_-food”=“fav1-food:”、“fav2-food”=“fav2-food:”)我明白了。这对我合适。再次感谢您的帮助。只是为了好玩,添加了一个完整的解决方案,包括自动化专栏namingThank you。现在它是完美的。
dfnew<-df %>% pivot_longer(-person_, names_to="note",values_to="value") %>%
  mutate(note=gsub("(\\d)\\. (\\w*\\:)?.*","\\1\\2",value), value=gsub("(\\d\\.) (\\w*\\:)? ?(.*)","\\3",value))
dfnew$note<-ifelse(!grepl(":",dfnew$note),paste0(dfnew$note,"colour"),dfnew$note)
dfnew2<-dfnew %>% mutate(note=tolower(gsub("(\\d)(\\w*)?:","\\1\\2",note))) %>%
  filter(!is.na(value)) %>%
  pivot_wider(names_from = note, values_from = value, names_prefix = "fav") %>%
  select(order(sapply(sapply(strsplit(names(.),""),rev),function(x) paste0(x,collapse=""))))


# A tibble: 4 x 5
  person_ fav1food  fav2food  fav1colour fav2colour
  <fct>   <chr>     <chr>     <chr>      <chr>     
1 Peter   Pasta     Spaghetti Red        Purple    
2 Lucas   Pancake   Chips     Blue       Green     
3 Jake    Hamburger NA        Red        White     
4 Harry   Pizza     NA        Yellow     NA