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