Почему base R `ifelse ()` периодически превращает мои символьные векторы в матрицы? - PullRequest
2 голосов
/ 25 апреля 2019
library(tidyverse)
df <- tibble(col1 = c(5, 2), col2 = c(6, 4), col3 = c(9, 9))
# # A tibble: 2 x 3
#    col1  col2  col3
#   <dbl> <dbl> <dbl>
# 1     5     6     9
# 2     2     4     9


df.cha <- df %>% mutate(col4 = ifelse(apply(.[, 1:3], 1, sd) > 3,
                                      "True",
                                      "False"))
df.cha$col4
#[1] "False" "True" 

Код выше работает нормально. Столбец 4 - это столбец символов, как я и ожидал. Тем не менее, я могу добавить одно дополнительное условие к моему утверждению ifelse, которое является & .[, 3] > 0, и внезапно R создает матрицы для столбца 4 вместо того, чтобы оставить его как символьный вектор, как я хочу. Смотри ниже.

Почему это?

df.mat <- df %>% mutate(col4 = ifelse(apply(.[, 1:3], 1, sd) > 3 & 
                                        .[, 3] > 0,  # I only added this
                                      "True",
                                      "False"))
df.mat$col4
#      col3   
# [1,] "False"
# [2,] "True" 

1 Ответ

5 голосов
/ 25 апреля 2019

apply() сначала преобразует ваш ввод в матрицу, затем, когда вы запускаете sd () для этой матрицы, вы получаете простой вектор.

Но когда вы делаете .[,3] с тибблом, вы получаетеоткинуть назад.Выбор одного столбца не упрощает вектор, как с data.frames.Обратите внимание, что вы бы получили другое поведение, если бы df был data.frame, а не tibble.

Так что «проблема» на самом деле не в ifelse().Это тот факт, что вы выполняете сравнения на тибле, поэтому форма сохраняется, а не упрощается до вектора.И так уж вышло, что tibble + больше-меньше / меньше вернет матрицу по дизайну.

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