¿Cómo unir dos data.frames juntos en R, haciendo referencia a una tabla de búsqueda
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
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:
- 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 losall
,all.x
y parámetrosall.y
para especificar qué tipo de unión que desea. - 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)?