¿Cómo unir dos data.frames juntos en R, haciendo referencia a una tabla de búsqueda

StackOverflow https://stackoverflow.com/questions/2352813

  •  23-09-2019
  •  | 
  •  

Pregunta

Estoy tratando de fusionar dos data.frames juntos, basado en un nombre de columna común en cada uno de ellos llamado series_id. Aquí está mi declaración de fusión:

merge(test_growth_series_LUT,  test_growth_series, by = intersect(series_id, series_id))

El error que estoy recibiendo es

  

Error en as.vector (y): objeto 'series_id' no encontrado

La ayuda da esta descripción, pero no veo por qué no puede encontrar el series_id. Ejemplo de datos es a continuación.

### S3 method for class 'data.frame':
   #merge(x, y, by = intersect(names(x), names(y)),
   #      by.x = by, by.y = by, all = FALSE, all.x = all, all.y = all,
   #      sort = TRUE, suffixes = c(".x",".y"), ...)



# Create a long data.frame to store data...
test_growth_series = data.frame ("read_day" = c(0, 3, 9, 0, 3, 9, 0, 2, 8), 
"series_id" = c("p1s1", "p1s1", "p1s1", "p1s2", "p1s2", "p1s2", "p3s4", "p3s4", "p3s4"),
"mean_od" = c(0.6, 0.9, 1.3, 0.3, 0.6, 1.0, 0.2, 0.5, 1.2),
"sd_od" = c(0.1, 0.2, 0.2, 0.1, 0.1, 0.3, 0.04, 0.1, 0.3),
"n_in_stat" = c(8, 8, 8, 8, 7, 5, 8, 7, 2)
)

# Create a name LUT
test_growth_series_LUT = data.frame ("series_id" = c("p1s1", "p1s2", "p3s4", "p4s2", "p5s2", "p6s2", "p7s4", "p8s4", "p9s4"),"description" = c("blah1", "blah2", "blah3", "blah4", "blah5", "blah6", "blah7", "blah8", "blah9")
)

> test_growth_series
  read_day series_id mean_od sd_od n_in_stat
1        0      p1s1     0.6  0.10         8
2        3      p1s1     0.9  0.20         8
3        9      p1s1     1.3  0.20         8
4        0      p1s2     0.3  0.10         8
5        3      p1s2     0.6  0.10         7
6        9      p1s2     1.0  0.30         5
7        0      p3s4     0.2  0.04         8
8        2      p3s4     0.5  0.10         7
9        8      p3s4     1.2  0.30         2
> test_growth_series_LUT
  series_id description
1      p1s1       blah1
2      p1s2       blah2
3      p3s4       blah3
4      p4s2       blah4
5      p5s2       blah5
6      p6s2       blah6
7      p7s4       blah7
8      p8s4       blah8
9      p9s4       blah9
> 



this is what I'm trying to achieve:  
> new_test_growth_series
  read_day series_id mean_od sd_od n_in_stat        description
1        0      p1s1     0.6  0.10         8        blah1
2        3      p1s1     0.9  0.20         8        blah1
3        9      p1s1     1.3  0.20         8        blah1
4        0      p1s2     0.3  0.10         8        blah2
5        3      p1s2     0.6  0.10         7        blah2
6        9      p1s2     1.0  0.30         5        blah2
7        0      p3s4     0.2  0.04         8        blah3
8        2      p3s4     0.5  0.10         7        blah3
9        8      p3s4     1.2  0.30         2        blah3
¿Fue útil?

Solución

Sólo puede hacer esto:

merge(test_growth_series_LUT, test_growth_series)

se ajustará automáticamente a los nombres. Si es necesario especificar la columna, lo haces de esta manera:

merge(test_growth_series_LUT, test_growth_series, by = "series_id")

O esta manera si es necesario especificar en ambos lados (sólo es necesario si tienen diferentes nombres que desea para que coincida con el):

merge(test_growth_series_LUT, test_growth_series, by.x = "series_id", by.y = "series_id")

Yo recomiendo mirar los ejemplos (y caminar a través de ellos) yendo a la ayuda para la fusión (?merge) o llamando example("merge", "base") (menos útil que realmente caminar por sí mismo.

Dos notas:

  1. Nunca se tendría que usar la función se cruzan aquí. Utilice c() para especificar varios nombres de columna de forma explícita. O utilizar los all, all.x y parámetros all.y para especificar qué tipo de unión que desea.
  2. Usted podría usar comillas para especificar un nombre de columna en la mayoría de los casos, a menos que haya adjuntado los datos. De lo contrario, se quejará de no ser capaz de encontrar el nombre. En particular, las necesidades de nombre para estar en la ruta de búsqueda cuando no se está utilizando comillas.

Otros consejos

  

El error que estoy recibiendo es "Error en as.vector (y): objeto 'series_id' no encontrado"

Una columna en su hoja.de.datos puede hacer referencia a este aspecto: test_growth_series$series_id, que devuelve el vector de series_id de. Haciendo el intersecan es innecesaria , pero serían escritas correctamente como esto:

intersect(test_growth_series$series_id, test_growth_series_LUT$series_id)

Para ser un poco más correcto, es probable que desee hacer una unirse a izquierda utilizando all.x=TRUE. Esto le cubre en caso de un series_id de test_growth_series no aparece en la tabla de consulta. Sin ella, usted podría terminar filas que falta en su resultado.

merge(test_growth_series, test_growth_series_LUT, by = "series_id", all.x=TRUE)

En este tema también se discute en Cómo para unirse a las tramas de datos en R (interior, exterior, izquierdo, derecho)?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top