No quadro de dados R codificado abaixo, gostaria de substituir todas as vezes que B
aparecerem b
.
junk <- data.frame(x <- rep(LETTERS[1:4], 3), y <- letters[1:12])
colnames(junk) <- c("nm", "val")
isso fornece:
nm val
1 A a
2 B b
3 C c
4 D d
5 A e
6 B f
7 C g
8 D h
9 A i
10 B j
11 C k
12 D l
Minha tentativa inicial foi usar as instruções a for
e if
assim:
for(i in junk$nm) if(i %in% "B") junk$nm <- "b"
mas como tenho certeza de que você pode ver, isso substitui TODOS os valores de junk$nm
com b
. Eu posso ver por que isso está fazendo isso, mas não consigo substituí-lo apenas nos casos de lixo eletrônico $ nm onde o valor original estava B
.
NOTA: Consegui resolver o problema, gsub
mas com o interesse de aprender, o RI ainda gostaria de saber como obter minha abordagem original para o trabalho (se possível)
Respostas:
Mais fácil converter nm em caracteres e depois fazer a alteração:
EDIT: E se você realmente precisa manter nm como fatores, adicione isso no final:
fonte
outra maneira útil de substituir valores
fonte
Resposta curta é:
Dê uma olhada nos vetores Index na Introdução R (se você ainda não o leu).
EDITAR. Conforme observado nos comentários, esta solução funciona para vetores de caracteres, portanto falhe em seus dados.
Para fator melhor maneira é mudar de nível:
fonte
c("B","C")
. Fazerjunk$nm[junk$nm == "B"]
é o melhor caminho.b
do fator ao fator nm. A versão de diliop é de fato a melhor se você quiser trabalhar com personagens, não com fatores. (Sempre pensar sobre o tipo suas variáveis têm em primeiro lugar!)%in%
e==
estáNA
lidando:c(1,2,NA)==1
dáTRUE, FALSE, NA
masc(1,2,NA) %in% 1
dáTRUE, FALSE, FALSE
. E sim, eu esqueci de verificar se este trabalho: /Como os dados que você mostra são fatores, isso complica um pouco as coisas. A resposta de @ diliop aborda o problema convertendo
nm
para uma variável de caractere. Para voltar aos fatores originais, é necessária uma etapa adicional.Uma alternativa é manipular os níveis do fator em vigor.
Isso é bastante simples e muitas vezes esqueço que existe uma função de substituição para
levels()
.Edit: Como observado por @Seth nos comentários, isso pode ser feito em uma linha, sem perda de clareza:
fonte
levels()
. E o linerjunk <- within(junk, levels(nm)[levels(nm)=="B"] <- "b")
?A maneira mais fácil de fazer isso em um comando é usar o
which
comando e também não precisar alterar os fatores em caracteres, fazendo o seguinte:fonte
Você criou uma variável de fator
nm
para evitar evitar isso ou adicionar um nível adicional aos atributos do fator. Você também deve evitar usar<-
os argumentos para data.frame ()Opção 1:
Opção 2:
fonte
data.frame
?b
como um nível, basta alterar o nível que éB
ab
.a <- data.frame(x<-1:10)
. O nome da coluna não éx
apenas uma bagunçax....1.10
. Melhor usar data.frame (x = 1: 10). Então você sabe qual é o nome da sua coluna.predict()
qual reclamará se os níveis de fatores em novos dados não corresponderem aos usados para se ajustar ao modelo. Mais limpo a longo prazo para obter os dados formatados conforme desejado, do que depender de atalhos. Concordo que pode ser mais fácil para não torná-lo um fator, mas se ele já é um, ou precisa ser um para algum exercício de modelagem ...Se você estiver trabalhando com variáveis de caractere (observe que
stringsAsFactors
é falso aqui), poderá usar replace:fonte
Chame esta função usando a linha abaixo.
fonte