Применение функции для округления выбранных переменных - PullRequest
1 голос
/ 02 октября 2019

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

library(dplyr)

df1 <- tibble(
  geo_lev = c("USA", "France", "England", "Ukraine", "Poland"),
  reg_lev = c("one", "two", "one", "two", "one"),
  number = c(101, 10, 14, 19, 22))

Так я бы округлял данные без функции

df1 %>% 
  mutate(number=ifelse(geo_lev =='USA' & reg_lev !='two', 
                                    round(number, -1),
                       number))

Я пытался разработать функцию для этого, но она не совсем работает

round <- function(x) {
  result = round(x, -1) 
  if (geo_lev =='USA' & reg_lev !='two')}

Одна из примененных функций Я бы хотел, чтобы данные выглядели так

round(df1)

df1 <- tibble(
  geo_lev = c("USA", "France", "England", "Ukraine", "Poland"),
  reg_lev = c("one", "two", "one", "two", "one"),
  number = c(100, 10, 14, 19, 22))

Кто-нибудь знает, как я разработал бы эту функцию? Я новичок в написании функций, поэтому есть синтаксическая ошибка, которую я не могу понять.

Ответы [ 2 ]

2 голосов
/ 02 октября 2019

Прежде всего, не создавайте функции с тем же именем, что и base R functions. У меня просто была проблема с этим. Я создал для вас тестовую round() функцию, и она была сохранена в среде R, и я ее не знал. Когда я вызывал функцию base R round(), она фактически вызывала мою тестовую функцию round(). Код дал мне некоторую ошибку. Я перезапустил R несколько раз без удачи. Наконец я понял, что раньше я создал тестовую функцию round() и удалил ее вручную из среды R, а затем все решилось.

В любом случае, вот ваш ответ:

library(dplyr)
# test data as in question
round_fun <- function(x) {
  x %>% 
    mutate(new_number = ifelse((geo_lev =='USA' & 
                     reg_lev !='two'), round(number,-1), number))
  }

Вывод:

# A tibble: 5 x 4
  geo_lev reg_lev number new_number
  <chr>   <chr>    <dbl>      <dbl>
1 USA     one        101        100
2 France  two         10         10
3 England one         14         14
4 Ukraine two         19         19
5 Poland  one         22         22
1 голос
/ 02 октября 2019

Вы можете сделать

new_round <- function(df) {
   with(df, ifelse(geo_lev =='USA' & reg_lev !='two', round(number, -1), number))
}

df1$number <- new_round(df1)
df1
# A tibble: 5 x 3
#  geo_lev reg_lev number
#  <chr>   <chr>    <dbl>
#1 USA     one        100
#2 France  two         10
#3 England one         14
#4 Ukraine two         19
#5 Poland  one         22

Или мы можем передать столбцы индивидуально

new_round <- function(geo_lev, reg_lev, number) {
   ifelse(geo_lev =='USA' & reg_lev !='two', round(number, -1), number)
}

library(dplyr)
df1 %>% mutate(round1 = new_round(geo_lev, reg_lev, number))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...