【问题标题】:Elimating double Quotes in a Dataframe消除数据框中的双引号
【发布时间】:2022-01-11 15:29:34
【问题描述】:

我有一个包含 27 列的数据框。所有这些列的数据结构都类似于以下。

principal_amt <- c('"pa": "5975.00"', '"pa": "2285.00"', '"pa": "15822.00"')
closed_accounts <- c( '"ca": 0', '"ca": 3', '"ca": 0')
status <- c(' "loan_status": "Paid" ', ' "loan_status": "Funded"',' "loan_status": "Funded"')
DF <- data.frame(principal_amt, closed_accounts)

我想自动删除观察中存在的双引号,以便最终的数据框具有与此类似的结构。

principal_amt <- c(5975.00, 2285.00, 15822.00)
closed_accounts <- c(0, 3, 0)
status <- c('Paid','Funded','Funded')
DF_Final <- data.frame(principal_amt, closed_accounts)

我该怎么做?

【问题讨论】:

  • 从"pa": "5975.00" 中删除双引号导致pa: 5975.00,而不是5975

标签: r regex text-parsing


【解决方案1】:

readr 包附带了一个方便的 parse_number 函数,用于此类用例。

library(tidyverse)

DF %>%
  mutate(across(.fns = parse_number))

  principal_amt closed_accounts
1          5975               0
2          2285               3
3         15822               0

名义变量的更新方法 - 提取匹配项。查看: " 后面,然后提取所有内容,直到单词边缘为空字符串。

DF %>%
  mutate(across(c(1,3), parse_number),
         across(2, str_extract, "(?<=: \").*\\b"))
 principal_amt status closed_accounts
1          5975   Paid               0
2          2285 Funded               3
3         15822 Funded               0

【讨论】:

  • 编辑了问题以添加我最初省略的名义变量。如何重构整个数据框?
  • @Muli across 的第一个参数是要应用函数的列。遵循与以前相同的逻辑,删除所有行都相同的多余部分,如 load_status,可以使用正则表达式。我不是这些方面的专家,但这个似乎有效。提示:如果您在帖子中添加标签 regex,您很可能会迅速获得有效的解决方案。确保清楚地说明包含的边缘情况,例如新添加变量的第一个元素中的额外空间。
  • 谢谢,我的代码已经运行,但是当我打印新数据框的结构时,状态列中的观察结果显示为“\”Paid”、”\“Funded”或“\ “取消”。你知道原因吗?
  • @Muli 可能是因为边缘情况并未全部涵盖。您可以尝试trimws 来读取字符串开头和开头的空格。
  • @DonaldSeinen trimws 确实是解决这个问题的方法。我的回答中也有。
【解决方案2】:

这样就可以了。

principal_amt <- gsub("[^0-9.-]", "", c('"pa": "5975.00"', '"pa": "2285.00"', '"pa": "15822.00"'))
closed_accounts <- gsub("[^0-9.-]", "",c( '"ca": 0', '"ca": 3', '"ca": 0'))
DF <- data.frame(principal_amt, closed_accounts)

【讨论】:

    【解决方案3】:

    基础 R

    DF <- as.data.frame(apply(
      apply(DF, 2, gsub, pattern = '[^0-9.-]', replacement = ''), 2, as.numeric
    ))
    

    输出

    > str(DF)
    'data.frame':   3 obs. of  2 variables:
     $ principal_amt  : num  5975 2285 15822
     $ closed_accounts: num  0 3 0
    

    添加(在编辑 OP 的问题后)

    如果data.frame 还包含数字变量旁边的字符变量,则以下应该有效。

    adapt_df <- \(DF) {
      new_df <- as.data.frame(sapply(1:ncol(DF), \(i)  {
        trimws(gsub(pattern = ifelse(grepl('\\d', DF[, i]), '[^0-9.-]', '^\\s.*\\b.*:|\\s$|"')[i], replacement = '', DF[, i]))
      }))
      for(i in 1:ncol(DF)) {
        new_df[, i] <- ifelse(grepl('\\d', new_df[, i]), as.numeric(new_df[, i]), new_df[, i])
      }
      names(new_df) <- names(DF)
      return(new_df)
    }
    DF <- adapt_df(DF)
    

    输出

    > str(DF)
    'data.frame':   3 obs. of  3 variables:
     $ principal_amt  : num  5975 2285 15822
     $ closed_accounts: num  0 3 0
     $ status         : chr  "Paid" "Funded" "Funded"
    

    【讨论】:

    • 在原始数据框中添加了一个分类变量。我该如何解决这个问题?
    • @Muli 我已经相应地修改了答案。
    • @Muli 小旁注:您还应该在问题中将status 添加到data.frame() ;-)
    • 太好了,非常感谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-26
    • 1970-01-01
    • 1970-01-01
    • 2019-04-02
    • 1970-01-01
    相关资源
    最近更新 更多