Как поменять местами ИСТИНА и ЛОЖЬ в кадре данных с помощью dplyr - PullRequest
0 голосов
/ 01 июня 2019

Я хочу изменить значения на их противоположные (T становится F, и наоборот) в определенных строках столбца в datatable

Я знаю, что x <- !x работает для T/F переменных, но как закончить этот dplyr подход:

library(dplyr)
library(datatable)
library(magrittr)
mtcars$selected <- T
mtcars %>% select(selected) %>% slice(c(1,4,5)) %>% mutate(??)

Ответы [ 2 ]

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

Если вы просто хотите подмножество этих строк, то ответ @ Shree, скорее всего, правильный.Если вы хотите инвертировать только эти строки, но в противном случае сохраните все, то что-то вроде:

В dplyr:

library(dplyr)
mtcars %>%
  mutate(selected = TRUE) %>%
  # the heart of the answer
  mutate(selected = if_else(row_number() %in% c(1, 4, 5), !selected, selected))
#     mpg cyl  disp  hp drat    wt  qsec vs am gear carb selected
# 1  21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4    FALSE
# 2  21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4     TRUE
# 3  22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1     TRUE
# 4  21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1    FALSE
# 5  18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2    FALSE
# 6  18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1     TRUE
# 7  14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4     TRUE
# 8  24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2     TRUE
# ...

Вы сказали datatable, я думаю, вы имели в виду data.table, в этом случае

library(data.table)
DT <- as.data.table(mtcars)
DT[, selected := TRUE]
DT[, selected := ifelse(.I %in% c(1, 3, 4), !selected, selected)]
head(DT, n = 8)
#      mpg cyl  disp  hp drat    wt  qsec vs am gear carb selected
#  1: 21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4    FALSE
#  2: 21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4     TRUE
#  3: 22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1    FALSE
#  4: 21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1    FALSE
#  5: 18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2     TRUE
#  6: 18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1     TRUE
#  7: 14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4     TRUE
#  8: 24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2     TRUE

Или по трубе как

library(magrittr)
DT <- as.data.table(mtcars)
DT %>%
  .[, selected := TRUE] %>%
  .[, selected := ifelse(.I %in% c(1, 3, 4), !selected, selected)]
head(DT, n = 8)
#     mpg cyl  disp  hp drat    wt  qsec vs am gear carb selected
# 1: 21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4    FALSE
# 2: 21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4     TRUE
# 3: 22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1    FALSE
# 4: 21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1    FALSE
# 5: 18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2     TRUE
# 6: 18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1     TRUE
# 7: 14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4     TRUE
# 8: 24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2     TRUE

В БазаR , вы можете сделать это следующим образом:

mtcars$selected <- TRUE
mtcars$selected[c(1, 3, 4)] <- !mtcars$selected[c(1, 3, 4)]
head(mtcars, n = 8)
#                    mpg cyl  disp  hp drat    wt  qsec vs am gear carb selected
# Mazda RX4         21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4    FALSE
# Mazda RX4 Wag     21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4     TRUE
# Datsun 710        22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1    FALSE
# Hornet 4 Drive    21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1    FALSE
# Hornet Sportabout 18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2     TRUE
# Valiant           18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1     TRUE
# Duster 360        14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4     TRUE
# Merc 240D         24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2     TRUE
1 голос
/ 01 июня 2019

Вот один из способов -

mtcars %>% 
  select(selected) %>% 
  slice(c(1,4,5)) %>% 
  mutate(
    selected = !selected # or as.logical(1 - selected)
  )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...