#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» … 🙂 Вы правы, хотя теоретически это не может быть очень обобщено