私はこのようなデータフレームを持っています
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が最初の列にマージされ、YearがNAである行のYear列にシフトされ、次の出力を持つ行の「Country」列の文字列をパターン「2018」で分割したいと思います。
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(.))
これが解決策です。少しトリッキーでしたが、あなたのケースをカバーしていると思います。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
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加