Как округлить определенные столбцы с помощью функции R? - PullRequest
1 голос
/ 17 апреля 2019

Я хочу округлить определенные столбцы, у каждого столбца разные значения округления. Я попытался с помощью следующего кода, но он выдает ошибку:

roundCols <-function(repo, namcol, digiround){
  repo[,"namcol"] = round(repo[,"namcol"], digits = digiround)
  round.staus = TRUE
  return(round.staus)
}
round.staus = FALSE

ils <- config[13]$ignoreColumns
ils <- gsub("\\{|\\}", "", ils)
ils <-  ils %>% str_replace_all("\\&", ",")
coldrp <- unlist(strsplit(ils, "\\,"))
coldrp = gsub("[^a-zA-Z]+", ".", coldrp)
td <- fread(config[13]$save.location,stringsAsFactors = FALSE,drop=coldrp,blank.lines.skip = TRUE)
col_rnm <- c(names(td[,2]),names(td[,3]))  #it has 2 column who's will be round off  
col_rd <- c(2,3)    #it gives digits how much rounding off required
for (i in 1:length(col_rnm)) {
  round.staus = roundCols(td,col_rnm,col_rd[i])
}
td

ошибка:

Ошибка в [.data.table (репо, "namcol"): столбцы не найдены: namcol

Я попробовал то же самое, что и в функции на консоли, которая дает точный результат.

Ожидаемый результат:

Account    Chargeable.Capacity   Expected.Capacity.in.30.days    Deviation
Kishore                0.01                 0.007              3.778268e-11

Первоначально Мои данные:

Account Chargeable.Capacity Expected.Capacity.in.30.days    Deviation
Kishore         0.007124108         0.007283185           3.778268e-11

выше того, что ожидается от функции с указанным кодом. Помогите мне решить эту ошибку. Усилия будут оценены.

1 Ответ

2 голосов
/ 17 апреля 2019

Сделайте это вместо:

for (i in 1:length(col_rnm)) {
  set(td, , col_rnm[i], round(td[, col_rnm[i], with = FALSE], col_rd[i]))
}

Если вы посмотрите на страницу справки для ?set (ту же страницу справки, что и ?":="), вы увидите, что она описана как

set - это петлевая версия с малыми издержками :=

Здесь вы найдете set, используемый во многих ответах, таких как этот и этот .


Причины, по которым ваш подход не сработал:

  • В вашем цикле отсутствует i: roundCols(td,col_rnm,col_rd[i]) необходимо использовать col_rnm[i]
  • Ваша функция roundCols не обновляет данные по ссылке с использованием синтаксиса data.table (либо set() или :=), ни обновляет данные return, поэтому любые изменения являются локальными для функции
  • Строка "namcol" с кавычками - это просто строка. Чтобы использовать аргумент namcol, вам нужно использовать его без кавычек.

Для этого вам не нужна дополнительная функция - описанный выше подход с set проще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...