消除数据框中的双引号

Elimating double Quotes in a Dataframe

我有一个包含 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)

我该怎么做?

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

这样就可以了。

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)

基础 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"