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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top