Строка разбивает строки данных на основе шаблона на новые столбцы - PullRequest
1 голос
/ 04 февраля 2020

У меня есть фрейм данных, который выглядит следующим образом

df

Country     Year  col3. col4. col5
USA2018      10    50    13   NA
UK 2018       4    12     6   NA
China       2018   15     4    1
Malta        NA    2018  25    8

Я хотел бы разбить строки столбца «Страна» по шаблону «2018» для строк, где 2018 объединен в первый столбец и сместился в столбец Год для строк, где Год является NA и имеет такой вывод:

df

Country     Year  col3. col4. col5
USA         2018   10    50    13   
UK          2018   4    12     6   
China       2018   15    4    1
Malta       2018   25    8     NA

Любое предложение?


Редактировать: Эти данные является результатом очистки PDF. Ссылка на PDF и код ниже:

# install.packages("pdftools") 
# install.packages("readr") 
library(pdftools) 
library(readr) 


epi <- pdf_text("malaria_epi.pdf") 
epi_df <- epi %>% 
  read_lines() %>% 
  grep('^\\s{2}\\w', ., value = TRUE) %>% 
  paste(collapse = '\n') %>% read_fwf(fwf_empty(.)) 

1 Ответ

1 голос
/ 04 февраля 2020

Вот решение. Это было немного сложно, но я думаю, что это покрывает ваше дело. Это решение может быть проблематичным c, если у вас есть NA в середине ряда, но мне пока не удалось найти лучший способ.

df <- read.table(header=TRUE, 
                 text="
Country     Year  col3. col4. col5
USA2018      10    50    13   NA
UK2018       4    12     6   NA
China       2018   15     4    1
Malta        NA    2018  25    8")

tmpN <- names(df) # save the colnames
df = cbind(df[,1],df) # duplicate the first column
df[,c(1,2)] <- lapply(df[,c(1,2)], as.character)

df[,1] = sub('[[:digit:]]+','',df[,1]) # remove date in first column
df[,2] = sub('[[:alpha:]]+','',df[,2]) # remove city in second column
df[df==''] <- NA # replace empty cells with NA

# push all NA to the right side
df2 = as.data.frame(t(apply(df,1, function(x) { return(c(x[!is.na(x)],x[is.na(x)]) )} )))
df2 <- df2[,!(colSums(is.na(df2))==nrow(df2))] # remove column full of NA

colnames(df2) <- tmpN # replace colnames
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...