Изменение значения переменной в фрейме данных с помощью функции в R

#r #function

#r #функция

Вопрос:

Фрейм данных

 df<-structure(list(V1 = c(1L, 2L, 2L, 3L, 2L), V2 = c(1L, 3L, 3L, 
1L, 2L), V3 = c(2L, 2L, 1L, 2L, 3L)), .Names = c("V1", "V2", 
"V3"), class = "data.frame", row.names = c(NA, -5L))
  

Вопрос

Чтобы написать функцию, которая изменяет переменную на: A, если переменная равна 1 B, если переменная равна 2 C, если переменная равна 3

Что я пробовал

Я написал функцию, но почему-то она не может обновить значения вне функции. Если я запускаю ее напрямую, она работает.

 test_recode<-function(x){
        require("memisc")
        x<-cases("A"<-x==1,
                 "B"<-x==2,
                 "C"<-x==3)}
 test_recode(df$V1)
  

Функция выполняется без ошибок, но фрейм данных по-прежнему не изменяется.

Однако он хорошо работает без функции.

 df$V1<-cases("A"<-df$V1==1,
             "B"<-df$V1==2,
             "C"<-df$V1==3)
  

Дополнительные комментарии

Я провел некоторое исследование и обнаружил, что это связано с <- и <<- но когда я изменил x<- на x<< — он присвоил значения x буквально. Как я могу указать функции присваивать значения переменной, которую я указываю в качестве параметра?

Кроме того, мне нужно придерживаться использования memisc cases функции.

Комментарии:

1. switch это функция, которая вам нужна: df$V1 <- sapply(df$V1, switch, "A", "B", "C") должна выполнять (что касается вашей функции, вам нужно что-то вернуть : return(x) )

2. и затем вам также нужно будет присвоить результат, df$V1<-test_recode(df$V1) .

3. @mtoto: но я уже выполнил назначение в своей функции:

4. Спасибо всем. Таким образом, очевидно, что вы не можете выполнить присваивание (переменной) внутри функции как таковой. Вам необходимо явно назначить фрейм данных функции.

5. @Cath, еще раз спасибо. Изменит мое мышление.

Ответ №1:

Очень простой подход был бы таким:

 apply(df, 2, function(x) chartr("123", "ABC", x))

#     V1  V2  V3 
#[1,] "A" "A" "B"
#[2,] "B" "C" "B"
#[3,] "B" "C" "A"
#[4,] "C" "A" "B"
#[5,] "B" "B" "C"
  

Комментарии:

1. Я не уверен, нужно ли это применять ко всем столбцам, но кроме этого очень умного варианта 🙂

Ответ №2:

Другая возможность с помощью LETTERS ,

 sapply(df, function(i) LETTERS[i])
#     V1  V2  V3 
#[1,] "A" "A" "B"
#[2,] "B" "C" "B"
#[3,] "B" "C" "A"
#[4,] "C" "A" "B"
#[5,] "B" "B" "C"
  

Комментарии:

1. Я тоже так думал. Но вы никогда не знаете, идет ли строка прямо вперед или 4 может быть «K» ;-).

2. @J_F Давай, 4 никогда не может быть «K» … 🙂 Вы правы, хотя теоретически это не может быть очень обобщено