vacio - reemplazando valores en una columna con otra columna R
seleccionar columnas en r (4)
Tengo dos tablas en diferentes dimensiones, ahora quiero reemplazar el valor datA $ swl1 con valores en datB $ swl2 según userids.
datos
id swl1
1 0.8
2 0.7
3 0.4
4 0.7
5 0.0
datB
id swl2
1 0.8
3 0.6
5 0.7
salida
datA (aquí swl1 se reemplaza por los nuevos valores en swl2, pero no todos los identificadores tienen nuevos valores, para los que no, los valores originales se conservan)
id swl1
1 0.8
2 0.7
3 0.6
4 0.7
5 0.7
¿como hacer esto?
Puede usar merge
para hacer coincidir por id
, luego reemplazar en la columna swl1
los elementos de datB
que existen:
datC <- merge(datA, datB, all.x=TRUE)
datC
## id swl1 swl2
## 1 1 0.8 0.8
## 2 2 0.7 NA
## 3 3 0.4 0.6
## 4 4 0.7 NA
## 5 5 0.0 0.7
Esto coincide con las filas. Ahora, para reemplazar esos valores en la columna swl1
con los valores no NA
de la columna swl2
:
datC$swl1 <- ifelse(is.na(datC$swl2), datC$swl1, datC$swl2)
datC$swl2 <- NULL
datC
## id swl1
## 1 1 0.8
## 2 2 0.7
## 3 3 0.6
## 4 4 0.7
## 5 5 0.7
Si desea seleccionar el valor más grande, independientemente de la columna en la que se encuentre, podría intentarlo
library(dplyr)
datA <- data.frame(id=c(1,2,3,4,5), swl1=c(0.8, 0.7, 0.4, 0.7, 0.0))
datB <- data.frame(id=c(1,3,5), somename=c(0.8, 0.6, 0.7))
datC <- full_join(datA, datB)
datA <- data.frame(id=c(1:5))
datA$swli1 <- apply(datC[, c(''swl1'', ''somename'')], 1, function(x) max(na.omit(x)))
> datA
id swli1
1 1 0.8
2 2 0.7
3 3 0.6
4 4 0.7
5 5 0.7
IIUC, utilizando data.table v1.9.5
:
require(data.table)
setDT(datA)[datB, swl1 := swl2, on = "id"]
datA
se actualiza por referencia.
Puede obtener este resultado con una línea de código:
datA$swl1[datA$id %in% datB$id] <- datB$swl2
#> datA
# id swl1
#1 1 0.8
#2 2 0.7
#3 3 0.6
#4 4 0.7
#5 5 0.7
Con el operador %in%
seleccionamos las entradas de la columna datA$swl1
que pertenecen a las filas con la misma id
que las enumeradas en datB
. Estos valores en la columna de datA$swl1
se reemplazan con las entradas de la columna datB
de datB
.