Условно конвертировать строки в конкретное числовое значение - PullRequest
0 голосов
/ 14 февраля 2019

Я уверен, что на это есть простой ответ, но я просканировал переполнение стека и не смог найти решение.Казалось бы, потенциально сочетание функций sapply и ifelse сделало бы эту работу (но я не уверен).

Итак, у меня есть фрейм данных с символами, кроме одного столбца, который является числовым значением.

####Create dataframe which needs converting
df <- data.frame(Sample_1 = rep(letters[1:3], each = 3),
             Sample_2 = rep("a", times = 9))
df$Number <- rep(seq(from=1,to=3,by=1))

Я хотел бы преобразовать символы в этом кадре данных в конкретное число.То, во что должен быть преобразован символ, зависит от числа в последнем столбце.Таким образом, критерии были бы:

  • Если число = 1, то а должно измениться на 30, b должно измениться на 20, а с должно измениться на 10
  • Если число = 2, тоa должно измениться на 35, b должно измениться на 25, а c должно измениться на 15
  • Если число = 3, то a изменить на 40, b изменить на 30, а c изменить на 20

Вот кадр данных, выделяющий это преобразование

A <- c(30,20,10)
B <- c(35,25,15)
C <- c(40,30,20)
Conversion_df <- data.frame(A, B,C)

А вот желаемый результат.

Final <- data.frame(Sample_1 = c(30,20,10,35,25,15,40,30,20),
                Sample_2 = c(30,20,10,30,20,10,30,20,10))

Заранее благодарю за любую помощь.

Ответы [ 3 ]

0 голосов
/ 14 февраля 2019

У меня также есть решение dplyr, но с использованием case_when, что, возможно, немного более прозрачно.Идея взята из этого ответа https://stackoverflow.com/a/24459900/5795592

 library(dplyr)
 df %>% mutate( # Sample_1
                    Sample_1_conv = case_when( Number == 1 & Sample_1 == "a" ~ 30
                        , Number == 1 & Sample_1 == "b" ~ 25
                        , Number == 1 & Sample_1 == "c" ~ 10
                        , Number == 2 & Sample_1 == "a" ~ 35
                        , Number == 2 & Sample_1 == "b" ~ 25
                        , Number == 2 & Sample_1 == "c" ~ 15
                        , Number == 3 & Sample_1 == "a" ~ 40
                        , Number == 3 & Sample_1 == "b" ~ 30
                        , Number == 3 & Sample_1 == "c" ~ 20)
                        # Sample_2
                    , Sample_2_conv = case_when( Number == 1 & Sample_2 == "a" ~ 30
                                               , Number == 1 & Sample_2 == "b" ~ 25
                                               , Number == 1 & Sample_2 == "c" ~ 10
                                               , Number == 2 & Sample_2 == "a" ~ 35
                                               , Number == 2 & Sample_2 == "b" ~ 25
                                               , Number == 2 & Sample_2 == "c" ~ 15
                                               , Number == 3 & Sample_2 == "a" ~ 40
                                               , Number == 3 & Sample_2 == "b" ~ 30
                                               , Number == 3 & Sample_2 == "c" ~ 20)
                        )
0 голосов
/ 18 февраля 2019

В соответствии с кодом, описанным @skulden в комментариях, вы также можете автоматически применять функцию 'valuate_sample' ко всем желаемым столбцам (т. Е. К тем, которые закодированы как факторы внутри фрейма данных).

Вот функция, выделенная @skulden в предыдущем ответе.

valuate_sample <- function(x,y) {
ifelse(y==1, ifelse(x=='a',30, ifelse(x=='b',20, 10)),
       ifelse(y==2, ifelse(x=='a',35, ifelse(x=='b',25, 15)),
              ifelse(y==3, ifelse(x=='a',40, ifelse(x=='b',30, 20)),0)))
}

А вот как это можно применить ко всем столбцам.

for(column in names(df)) { if(is.factor(df[,column])){

   df[,column] <- valuate_sample(df[,column], df[,'Number'])

}
0 голосов
/ 14 февраля 2019

Сначала мы можем создать функцию для оценки выборки с помощью операторов if:

valuate_sample <- function(x,y) {
    ifelse(y==1, ifelse(x=='a',30, ifelse(x=='b',20, 10)),
           ifelse(y==2, ifelse(x=='a',35, ifelse(x=='b',25, 15)),
                  ifelse(y==3, ifelse(x=='a',40, ifelse(x=='b',30, 20)),0)))
}

После того, как нам просто нужно использовать функцию в вашем фрейме данных:

df <- df %>% 
    mutate(
        Sample_1 = valuate_sample(Sample_1, Number),
        Sample_2 = valuate_sample(Sample_2, Number)
        )

Результат:

enter image description here

...