Mesclar mista em R - solução subscrito?
Pergunta
Nota: Eu mudei o exemplo de quando eu primeiro postado. Meu primeiro exemplo foi também simplificado para capturar o verdadeiro problema.
Eu tenho dois quadros de dados que são classificados de maneira diferente em uma coluna. Eu quero corresponder uma coluna e, em seguida, fundir-se no valor da segunda coluna. A segunda coluna precisa ficar na mesma ordem.
Então, eu tenho este:
state<-c("IA","IA","IA","IL","IL","IL")
value1<-c(1,2,3,4,5,6)
s1<-data.frame(state,value1)
state<-c("IL","IL","IL","IA","IA","IA")
value2<-c(3,4,5,6,7,8)
s2<-data.frame(state,value2)
s1
s2
que retorna isso:
> s1
state value1
1 IA 1
2 IA 2
3 IA 3
4 IL 4
5 IL 5
6 IL 6
> s2
state value2
1 IL 3
2 IL 4
3 IL 5
4 IA 6
5 IA 7
6 IA 8
e eu quero isso:
state value1 value2
1 IA 1 6
2 IA 2 7
3 IA 3 8
4 IL 4 3
5 IL 5 4
6 IL 6 5
Estou prestes a dirigir-me bobo tentando resolver isso. Parece que ele deve ser um problema subscrito simples.
Solução
Existem várias maneiras de fazer isso (é R, depois de tudo), mas acho que o mais claro é a criação de um índice. Precisamos de uma função que cria um índice sequencial (a partir de um e terminando com o número de observações).
seq_len(3)
> [1] 1 2 3
Mas precisamos calcular este índice dentro de cada variável de agrupamento (estado). Para isso podemos usar a função ave
de R. É preciso um numérico como o primeiro argumento, então os factores de agrupamento, e, finalmente, a função a ser aplicada em cada grupo.
s1$index <- with(s1,ave(value1,state,FUN=seq_len))
s2$index <- with(s2,ave(value2,state,FUN=seq_len))
(Observe o uso de with
, que narra R de pesquisa para as variáveis ??dentro do ambiente / trama de dados. Esta é uma prática melhor do que usar s1 $ value1, s2 $ valor2, etc.)
Agora podemos simplesmente fundir (se juntar) os dois quadros de dados (por variáveis ??presentes no ambos os quadros de dados: Estado e de índice).
merge(s1,s2)
que dá
state index value1 value2
1 IA 1 1 6
2 IA 2 2 7
3 IA 3 3 8
4 IL 1 4 3
5 IL 2 5 4
6 IL 3 6 5
Para que isso funcione, deve haver o mesmo número de observações por estado em cada um dos quadros de dados.
[Edit: comentou o código para maior clareza.] [Edit:. Usado seq_len em vez de criar uma nova função como sugerido por Hadley]
Outras dicas
NOTA: Verifique a 5ª comentário sobre a resposta acima. Solução deve ser
s1$index <- with(s1,ave(value1,state,FUN=seq_along))
s2$index <- with(s2,ave(value2,state,FUN=seq_along))
Testado e de trabalho.