Я хочу проанализировать некоторые базы данных, которые плохо структурированы. Поэтому я пытаюсь завершить следующий код, чтобы проанализировать его, добавив количество числовых символов.
TRACA2 <- data.frame("CAT"=rep("GEN1", 20), "ARTICLE"=rep(c("PRODUCT V29000655B","PRODUCT V29000658A","T172560088"),c(10,2,8)), "SERIAL"=rep(c("172560082","T172560088","PRODUCT V29000658A"),c(10,2,8)), "LIGNE" = "ISG3B51",stringsAsFactors = FALSE)
library(dplyr)
analyseData <- function (x, na.rm=FALSE) {
remplacement <- function(x, na.rm = FALSE) (if_else(is.na(sapply(x,as.numeric)),gsub("[0-9\\.]+","",x),as.character(paste0("<",nchar(as.numeric(x)),">"))))
x <- x %>% mutate_all(funs(recode=remplacement)) %>% select(ends_with("recode")) %>% group_by_all() %>% summarise(nb = n())
return (as.data.frame(x))
}
analyseData(TRACA2)
# CAT_recode ARTICLE_recode SERIAL_recode LIGNE_recode nb
#1 GEN PRODUCT VA T ISGB 2
#2 GEN PRODUCT VB <9> ISGB 10
#3 GEN T PRODUCT VA ISGB 8
Теперь я хочу получить следующее
# CAT_recode ARTICLE_recode SERIAL_recode LIGNE_recode nb
#1 GEN<1> PRODUCT V<8>A T<9> ISG<1>B<2> 2
#2 GEN<1> PRODUCT V<8>B <9> ISG<1>B<2> 10
#3 GEN<1> T<9> PRODUCT V<8>A ISG<1>B<2> 8
Буду признателен за любую помощь.
Спасибо
Попробуй это!
str_replace_all
имеет аргумент replacement
, который может принимать функцию; затем эта функция будет выполняться для каждого совпадения и вставлять результат вместо исходного совпадения.
Должно быть именно то, что вам нужно!
library(dplyr)
library(stringr)
TRACA2 %>%
mutate_all(funs(recode = str_replace_all(
.,
"[0-9\\.]+",
function(x) paste0("<", nchar(x), ">")
)
)) %>%
select(ends_with("recode")) %>%
group_by_all() %>%
summarise(nb = n())
PS Похоже, что funs
устарела; чтобы вместо этого использовать list
, напишите вторую строку следующим образом:
mutate_all(list(recode = ~ str_replace_all(