Как использовать функцию для преобразования нескольких столбцов с символьным значением в двоичное число в огромном data.frame? - PullRequest
3 голосов
/ 09 апреля 2019

У меня есть огромный data.frame с цифрами, символами и пропущенными значениями. Как преобразовать все «Истина» и «Ложь» (значения символов) в 1 и 0, сохранив при этом пропущенные значения?

Я пытался использовать функцию перекодирования dplyr, но она не относится к объекту класса data.frame.

df <- data.frame(Var1 = 150:154 , Var2 = c("True","True","","False","True"), 
Var3 = c("","True","True","False","True"), 
Var4 = 1116:1120, Var99 = c("","True","","False","True"))
> df
  Var1  Var2  Var3 Var4 Var99
1  150  True       1116      
2  151  True  True 1117  True
3  152        True 1118      
4  153 False False 1119 False
5  154  True  True 1120  True

и мой вывод будет:

> df2
  Var1 Var2 Var3 Var4 Var99
1  150    1      1116      
2  151    1    1 1117     1
3  152         1 1118      
4  153    0    0 1119     0
5  154    1    1 1120     1

Ответы [ 4 ]

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

Базовый подход R с as.logical и as.numeric:

> df[c("Var2", "Var3", "Var99")] <- lapply(df[c("Var2", "Var3", "Var99")], function(x){
+   as.numeric(as.logical(x))
+ })
> df
  Var1 Var2 Var3 Var4 Var99
1  150    1   NA 1116    NA
2  151    1    1 1117     1
3  152   NA    1 1118    NA
4  153    0    0 1119     0
5  154    1    1 1120     1

Также, как сказал @IceCreamToucan, если вы не хотите вводить переменные имена, используйте:

> vars_logic <- sapply(df, function(x) {all(x %in% c('True', 'False', ''))})
> 
> df[vars_logic] <- lapply(df[vars_logic], function(x){
+   as.numeric(as.logical(x))
+ })
> 
> df
  Var1 Var2 Var3 Var4 Var99
1  150    1   NA 1116    NA
2  151    1    1 1117     1
3  152   NA    1 1118    NA
4  153    0    0 1119     0
5  154    1    1 1120     1
2 голосов
/ 09 апреля 2019

Вы можете использовать функции dplyr mutate_if и case_when.Для простоты установите stringsAsFactors в FALSE при создании data.frame.

df <- data.frame(Var1 = 150:154 , Var2 = c("True","True","","False","True"), 
                 Var3 = c("","True","True","False","True"), 
                 Var4 = 1116:1120, Var99 = c("","True","","False","True"), stringsAsFactors = FALSE)

df %>% 
    mutate_if(is.character, ~case_when(. == "True" ~ 1L, 
                                       . == "False" ~ 0L, 
                                       . == "" ~ NA_integer_))
1 голос
/ 09 апреля 2019

Учитывая, что все столбцы с True / False являются факторами, вы можете попробовать это решение dplyr (однако, посмотрите также заметки, предоставленные @akrun):

df %>%
 mutate_if(is.factor, list(~ as.logical(.) * 1))

  Var1 Var2 Var3 Var4 Var99
1  150    1   NA 1116    NA
2  151    1    1 1117     1
3  152   NA    1 1118    NA
4  153    0    0 1119     0
5  154    1    1 1120     1

Или небольшоемодификация, основанная на идее @Santiago Capobianco:

df %>%
 mutate_if(is.factor, list(~ as.numeric(as.logical(.))))
1 голос
/ 09 апреля 2019

Опция будет mutate_if и перекодировать значения в 1, 0 с помощью fct_recode из forcats

library(dplyr)
library(forcats)
df %>% 
   mutate_if(is.factor, list(~ fct_recode(.,  "1" = "True", "0" = "False" )))
#    Var1 Var2 Var3 Var4 Var99
#1  150    1      1116      
#2  151    1    1 1117     1
#3  152         1 1118      
#4  153    0    0 1119     0
#5  154    1    1 1120     1

ПРИМЕЧАНИЕ. Вместо этого столбцы не были логическими (TRUE/FALSE), вместо этого(True/False).Таким образом, при сохранении объекта набора данных как такового и без каких-либо других предположений

ПРИМЕЧАНИЕ2: не изменит типы столбцов после преобразования


Для изменения в числовое значение это можно сделать с помощью match

df %>%
     mutate_if(is.factor,  list( ~ match(., c("False", "True")) - 1))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...