【问题标题】:String split rows of dataframe based on pattern into new columns字符串根据模式将数据帧的行拆分为新列
【发布时间】:2020-05-20 01:21:52
【问题描述】:

我有一个看起来像这样的数据框

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

我想将“Country”列的字符串拆分为“2018”模式,用于将 2018 合并到第一列的行,并针对 Year 为 NA 的行转移到 Year 列并具有此输出:

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抓取的结果。Link to 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(.)) 

【问题讨论】:

  • 我认为数据导入出错了,原始文件是什么样的?
  • 它是从pdf中抓取的
  • 如果可以的话,你能提供PDF和用于抓取的代码吗?如果不是,这可以用正则表达式来完成。但我希望我们可以修复导入步骤,而不是处理导入造成的问题。 (XY问题)
  • 我对您的帖子进行了更详细的编辑,以后请使用“编辑”。
  • 使用制表符查看related post

标签: r regex dataframe strsplit


【解决方案1】:

这里有一个解决方案。这有点棘手,但我认为它涵盖了你的情况。 如果您在一行中间有 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

【讨论】:

    猜你喜欢
    • 2021-04-16
    • 2021-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-07
    • 1970-01-01
    • 2018-10-24
    • 1970-01-01
    相关资源
    最近更新 更多