Как сделать цикл с переменной - PullRequest
0 голосов
/ 20 июня 2019

В настоящее время у меня есть 4 строки для простого ifelse на 4 столбца.Я довольно новичок в R, как я могу сделать это в одной строке?Спасибо !:)

Я пытался сделать это в функции, как

my_function <- function(var) {
datamart_apprentissage  <- mutate(datamart_apprentissage, var= ifelse(is.na(var), 0, 1))
}

my_function("VIE_OB3_1")
my_function("VIE_OB3_2")
my_function("VIE_OB3_3")
my_function("VIE_OB3_4")

, но не сработало

datamart_apprentissage  <- mutate(datamart_apprentissage, VIE_OB3_1 = ifelse(is.na(VIE_OB3_1), 0, 1))
datamart_apprentissage  <- mutate(datamart_apprentissage, VIE_OB3_2 = ifelse(is.na(VIE_OB3_2), 0, 1))
datamart_apprentissage  <- mutate(datamart_apprentissage, VIE_OB3_3 = ifelse(is.na(VIE_OB3_3), 0, 1))
datamart_apprentissage  <- mutate(datamart_apprentissage, VIE_OB3_4 = ifelse(is.na(VIE_OB3_4), 0, 1))

Спасибо!

Ответы [ 3 ]

1 голос
/ 20 июня 2019

Вы можете использовать применение по столбцам:

# Some data
df <- data.frame(a = c(1,2,NA,4), b = c(NA,NA,7,8))

# Function for replacing NA with value
myfun <- function(col) {
  out <- ifelse(is.na(col), 0, 1)
  return(out)
}

# Applying function column-wise (option = 2)
apply(df, 2, function(col) myfun(col))

# As oneliner
apply(df, 2, function(col) ifelse(is.na(col), 0, 1))
0 голосов
/ 20 июня 2019

Вы можете использовать sapply, который сохранит структуру dataframe.Ниже приведен пример, где вы можете заменить NA на "VALUE"

. Вы можете заменить function(x)ifelse своей собственной функцией (у меня нет опыта работы с mutate, поэтому я не могу помочь с этим.

Кроме того, вы можете выбрать только определенные строки / столбцы, используя [row,column]:

df <- data.frame(a=c(1,2,NA,NA,5),b=c(NA,7,8,NA,10),c=c(NA,7,8,NA,10),d=c(NA,7,8,NA,10),e=c(NA,7,8,NA,10))
df
df[,c(1,2)] <- sapply(df[,c(1,2)],function(x)ifelse(is.na(x),"VALUE",x))
df
0 голосов
/ 20 июня 2019

Вот решение, использующее dplyr, чтобы настроить преобразование столбца, используйте аргумент .vars в mutate_at:

library("dplyr", quietly = TRUE, warn.conflicts = FALSE)
datamart_apprentissage <- matrix(sample(x = c(NA, 2:3), size = 5*4, replace = TRUE), ncol = 4)
datamart_apprentissage <- as_tibble(datamart_apprentissage )
#> Warning: `as_tibble.matrix()` requires a matrix with column names or a `.name_repair` argument. Using compatibility `.name_repair`.
#> This warning is displayed once per session.
names(datamart_apprentissage) <- paste0("VIE_OB3_", 1:4)

# --- What you wanna do
datamart_apprentissage %>% 
        mutate_at(.vars = paste0("VIE_OB3_", 1:4), .funs = function(x) ifelse(is.na(x), 0, 1))
#> # A tibble: 5 x 4
#>   VIE_OB3_1 VIE_OB3_2 VIE_OB3_3 VIE_OB3_4
#>       <dbl>     <dbl>     <dbl>     <dbl>
#> 1         0         1         1         1
#> 2         1         0         1         1
#> 3         1         1         0         0
#> 4         0         1         0         1
#> 5         1         1         0         1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...