Векторизованный способ преобразования 0,1 столбца в логический? - PullRequest
0 голосов
/ 10 марта 2020

У меня большой набор данных, и меня попросили запустить сводную статистику по нему. Так как по умолчанию R считывает столбцы с 0 и 1 как целые числа, я хотел бы преобразовать их в логические перед запуском функции итога. В моем наборе данных есть большое количество столбцов, и многие из них имеют разновидность 0/1. Я не мог найти простой способ конвертировать их все сразу, поэтому я использовал для l oop:

for (n in 1:ncol(houses)) {
  if (all(unique(houses[, n]) == c(0, 1)) | all(unique(houses[, n]) == c(0, 1, NA)))
    houses[, n] %<>% as.logical
}

Однако не только столбцы с уникальным вектором (0, 1 , NA) не конвертировать, я получаю следующее предупреждение несколько раз:

longer object length is not a multiple of shorter object length

Это заставляет меня поверить, что должен быть лучший способ сделать это - я просто не уверен, что это такое.

Вот первые 10 строк df:

       sp transbkc sameagt sqft newhouse age bedrooms baths acre firepl garagesz septic whrlpool occ poorcond
1  366000       NA       0 3400        1   1        4  4.00 1.28      0        3      0        0   0        0
2   99000       NA       0 1900        0   9        3  2.50 1.29      0        2      0        0   0        0
3  240000       NA       0 4000        0   4        4  3.25 1.40      0        2      0        0   1        0
4  112900       NA       0 1830        1   1        4  2.50 1.22      0        2      0        0   0        0
5   45000       NA       0 1250       NA  NA        3  1.00 1.43      0        1      0        0   0        0
6   43000       NA       0 1195       NA  NA        2  1.00 1.21      0        0      0        0   0        0
7  127000       NA       0 2350        1   1        4  2.00 1.50      0        2      0        0   0        0
8  191150       NA       0 2602        1   1        3  2.00 1.63      0        3      0        0   0        0
9  104000       NA       0 2000       NA  NA        4  2.00 1.30      0        2      0        0   0        0
10  55000       NA       0 1600       NA  NA        4  1.75 1.24      0        1      0        0   1        0
   someren suprcond mednage elevationmeter  medincrl pctcollg timetrend distress bedpcttotal   lncdom fld1 fld2
1        0        0    38.3         238.60 1.3916808     54.2       168        0   0.5000000 0.000000    0    0
2        0        1    40.8         178.30 1.1682903     35.7       173        0   0.4285714 5.945421    0    0
3        0        1    47.8         223.69 1.4259059     63.8        48        0   0.4000000 4.795791    0    0
4        0        0    35.3         225.56 1.4160610     54.1       237        0   0.5714286 5.793014    0    0
5        1        0    34.4         212.84 0.4369706     20.2       161        0   0.5000000 5.525453    0    0
6        0        1    30.2         184.95 0.3092624      3.9       251        0   0.5000000 5.730100    1    0
7        0        0    39.9         239.09 1.0349982     29.7        83        0   0.5714286 5.303305    0    0
8        0        0    35.8         264.44 1.8390805     57.3        67        0   0.3750000 6.251904    0    0
9        1        0    40.8         178.52 1.1682903     35.7        14        0   0.4444444 5.493062    0    0
10       0        0    40.0         235.25 0.7435699     28.4        74        0   0.5000000 4.941642    0    0
         ovrpr
1   0.34544754
2   0.01377296
3  -0.13879776
4   0.09606838
5           NA
6           NA
7   0.11856365
8   0.21277618
9           NA
10          NA

1 Ответ

1 голос
/ 10 марта 2020

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

houses[] <- lapply(houses, function(x) 
              if(all(x %in% c(0, 1, NA))) as.logical(x) else x)

Это приведет к преобразованию столбцов в логические, которые имеют значение 0, 1 или NA в столбце.

В dplyr мы можем использовать mutate_if.

library(dplyr)
houses %>%  mutate_if(~all(. %in% c(0, 1, NA)), as.logical)
...