sustituir - Reemplazo de ocurrencias de un número en múltiples columnas de marco de datos con otro valor en R
sustituir na por 0 en r (4)
ETA: el punto de lo siguiente, por cierto, es no tener que recorrer todo mi conjunto de vectores de columnas, por si acaso fue una solución propuesta (solo haga lo que se sabe que funciona una vez a la vez).
Hay muchos ejemplos de cómo reemplazar valores en un solo vector de un cuadro de datos en R con algún otro valor.
- Reemplace un valor en un marco de datos basado en una declaración condicional (
if
) en R - Reemplazar números en la columna de marco de datos en r [duplicado]
Y también cómo reemplazar todos los valores de NA
con algo más:
Lo que busco es análogo a la última pregunta, pero básicamente tratar de reemplazar un valor por otro. Tengo problemas para generar un marco de datos de valores lógicos asignados a mi marco de datos real para los casos en que varias columnas cumplan con un criterio, o simplemente intente realizar las acciones de las dos primeras preguntas en más de una columna.
Un ejemplo:
data <- data.frame(name = rep(letters[1:3], each = 3), var1 = rep(1:9), var2 = rep(3:5, each = 3))
data
name var1 var2
1 a 1 3
2 a 2 3
3 a 3 3
4 b 4 4
5 b 5 4
6 b 6 4
7 c 7 5
8 c 8 5
9 c 9 5
Y digamos que quiero que todos los valores de 4
en var1
y var2
sean 10
.
Estoy seguro de que esto es elemental y no lo estoy pensando correctamente. He estado probando cosas como:
data[data[, 2:3] == 4, ]
Eso no funciona, pero si hago lo mismo con los data[, 2]
lugar de los data[, 2:3]
, las cosas funcionan bien. Parece que las pruebas lógicas (como is.na()
) funcionan en varias filas / columnas, pero ¿las comparaciones numéricas no funcionan tan bien?
Gracias por cualquier sugerencia!
Básicamente, los data[, 2:3]==4
le dieron el índice para los data[,2:3]
lugar de los data
:
R > data[, 2:3] ==4
var1 var2
[1,] FALSE FALSE
[2,] FALSE FALSE
[3,] FALSE FALSE
[4,] TRUE TRUE
[5,] FALSE TRUE
[6,] FALSE TRUE
[7,] FALSE FALSE
[8,] FALSE FALSE
[9,] FALSE FALSE
Así que puedes intentar esto:
R > data[,2:3][data[, 2:3] ==4]
[1] 4 4 4 4
Solo para proporcionar una respuesta diferente, pensé que escribiría un enfoque de vector-matemática:
Puede crear una matriz de transformación (en realidad, un marco de datos aquí, pero funcionará igual), usando la declaración vectorizada ''ifelse'' y multiplique la matriz de transformación y sus datos originales, de esta manera:
df.Rep <- function(.data_Frame, .search_Columns, .search_Value, .sub_Value){
.data_Frame[, .search_Columns] <- ifelse(.data_Frame[, .search_Columns]==.search_Value,.sub_Value/.search_Value,1) * .data_Frame[, .search_Columns]
return(.data_Frame)
}
Para reemplazar todos los valores 4 por 10 en el cuadro de datos ''datos'' en las columnas 2 a 3, debe usar la función así:
# Either of these will work. I''m just showing options.
df.Rep(data, 2:3, 4, 10)
df.Rep(data, c("var1","var2"), 4, 10)
# name var1 var2
# 1 a 1 3
# 2 a 2 3
# 3 a 3 3
# 4 b 10 10
# 5 b 5 10
# 6 b 6 10
# 7 c 7 5
# 8 c 8 5
# 9 c 9 5
Solo por continuidad
data[,2:3][ data[,2:3] == 4 ] <- 10
Pero se ve feo, así que hacerlo en 2 pasos es mejor.
desea buscar en todo el marco de datos para cualquier valor que coincida con el valor que está tratando de reemplazar. de la misma manera en que puede ejecutar una prueba lógica como reemplazar todos los valores faltantes con 10 ...
data[ is.na( data ) ] <- 10
También puede reemplazar todos los 4s con 10s.
data[ data == 4 ] <- 10
Al menos creo que eso es lo que buscas.
y digamos que querías ignorar la primera fila (ya que son todas las letras)
# identify which columns contain the values you might want to replace
data[ , 2:3 ]
# subset it with extended bracketing..
data[ , 2:3 ][ data[ , 2:3 ] == 4 ]
# ..those were the values you''re going to replace
# now overwrite ''em with tens
data[ , 2:3 ][ data[ , 2:3 ] == 4 ] <- 10
# look at the final data
data