Как разобрать {; } и извлечь номер в первой позиции? - PullRequest
0 голосов
/ 14 апреля 2020

Воспроизводимый, подмножество моих данных:

owed <- c("{7; 125.04}, {203; 125.04}, {90; 125.04}", "{45; 50.72}, {355; 50.72}", "#N/A")
uuid <- c(1, 2, 3)
data <- data.frame(uuid, owed)

Столбец задолженность показывает, сколько раз каждый uuid имел задолженность в следующей структуре {количество в долговых днях; задолженность} . Не существует максимального ограничения, сколько раз каждый uuid имел долги - у некоторых uuids было более 80 случаев.

Я хотел бы иметь третий столбец avg_debt_days , которая вычисляет среднее значение в днях задолженности для каждого uuid . В этом примере результат должен быть 100, 200, # N / A для uuid 1, 2, 3 соответственно.

Учитывая, что у меня есть 100 000 строк данных, кто-нибудь может предложить метод для преобразования и эффективного вычисления?

1 Ответ

0 голосов
/ 14 апреля 2020

Вы можете использовать вложенные вызовы sapply и strsplit для создания простой полностью векторизованной функции:

get_days      <- function(x) suppressWarnings(as.numeric(gsub(" |[{]|[}]", "", x)))[1]
get_mean_days <- function(x) mean(sapply(strsplit(x, ";"), get_days))
days_in_debt  <- function(x) sapply(strsplit(x, ", "), get_mean_days)

Так что теперь вы можете просто сделать:

days_in_debt(data$owed)
#> [1] 100 200  NA
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...