Переименовать уровни в нескольких конкретных факторах в кадре данных - PullRequest
2 голосов
/ 17 марта 2019

У меня есть фрейм данных DF:

DF <- data.frame(V1 = factor(c("Yes", "No", "Yes", "No", "No")),
                 V2 = factor(c("Yes", "No", "No", "Yes", "No")),
                 Location = factor(c("London", "Paris", "No", "Dallas", "No")),
                 V3 = factor(c("No", "Yes", "No", "No", "No")),
                 V4 = factor(c("No", "Yes", "No", "No", "No")))

Я хочу изменить значения "No" в переменных V1, V2, V3 и V4 - но не Location - до "X".Я могу легко изменить названия уровней вручную в каждом столбце, но это занимает много времени в большом наборе данных.Однако, если я использую revalue, то все "No", включая те, что в Location, которые я хочу оставить без изменений, заменяются на "X":

library("plyr")
as.data.frame(lapply(DF, function(x) { revalue(x, c("No"="X")) }))

Есть ли способуказать переменные на основе их положения в наборе данных (здесь столбцы 1: 2 и 4: 5), к которым применяется переименование?

Ответы [ 3 ]

1 голос
/ 17 марта 2019

Просто укажите номера столбцов, к которым вы хотите применить функцию revalue:

cols_to_update <- c(1:2,4:5)
DF[, cols_to_update] <- lapply(DF[,cols_to_update], function(x) plyr::revalue(x, c("No"="X")))
1 голос
/ 17 марта 2019

Вы также можете сделать это, используя подход tidyverse:

library(dplyr)
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union
library(plyr)
#> -------------------------------------------------------------------------
#> You have loaded plyr after dplyr - this is likely to cause problems.
#> If you need functions from both plyr and dplyr, please load plyr first, then dplyr:
#> library(plyr); library(dplyr)
#> -------------------------------------------------------------------------
#> 
#> Attaching package: 'plyr'
#> The following objects are masked from 'package:dplyr':
#> 
#>     arrange, count, desc, failwith, id, mutate, rename, summarise,
#>     summarize
DF <- data.frame(V1 = factor(c("Yes", "No", "Yes", "No", "No")),
                 V2 = factor(c("Yes", "No", "No", "Yes", "No")),
                 Location = factor(c("London", "Paris", "No", "Dallas", "No")),
                 V3 = factor(c("No", "Yes", "No", "No", "No")),
                 V4 = factor(c("No", "Yes", "No", "No", "No")))
(DF <- DF %>%
    mutate_at(.vars = vars(-Location),
              .funs = function(t) revalue(x = t,
                                          replace = c("No" = "X"))))
#>    V1  V2 Location  V3  V4
#> 1 Yes Yes   London   X   X
#> 2   X   X    Paris Yes Yes
#> 3 Yes   X       No   X   X
#> 4   X Yes   Dallas   X   X
#> 5   X   X       No   X   X

Создано в 2019-03-17 пакетом представлением (v0.2.1)

1 голос
/ 17 марта 2019

Возможно, кто-то может предложить более элегантное решение, однако решение, которое работает (без изменения каждой переменной вручную), выглядит следующим образом:

change.vec = c("V1", "V2", "V3", "V4")

for(i in 1:length(change.vec)) {
    levels(DF[,change.vec[i]]) = c("X", "Yes")  
}

>DF
 V1  V2 Location  V3  V4
 1 Yes Yes   London   X   X
 2   X   X    Paris Yes Yes
 3 Yes   X       No   X   X
 4   X Yes   Dallas   X   X
 5   X   X       No   X   X
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...