消除数据框中的双引号
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"
我有一个包含 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"