Librería utilizada y carga de datos
#install.packages("dplyr") # Instalar de manipulación de dataframes "dplyr"
library(dplyr) # Cargar la librería de manipulación de dataframes "dplyr"
nombre <- c("A","B","C","D","E","F","G","H","I","J")
sexo <- c(rep("man",5),rep("woman",5))
edad <- c (25,14,25,76,12,90,65,45,56,43)
pais <- c(rep("spain",3),rep("italy",3),rep("portugal",4))
datos <- data.frame(nombre=nombre,sexo=sexo,edad=edad,pais=pais)
head(datos)
## nombre sexo edad pais
## 1 A man 25 spain
## 2 B man 14 spain
## 3 C man 25 spain
## 4 D man 76 italy
## 5 E man 12 italy
## 6 F woman 90 italy
Filtrar de datos por filas
Forma simple
filter(datos, sexo == "man", pais == "spain")
## nombre sexo edad pais
## 1 A man 25 spain
## 2 B man 14 spain
## 3 C man 25 spain
Forma farragosa
datos[datos$sexo == "man" & datos$pais == "spain", ]
## nombre sexo edad pais
## 1 A man 25 spain
## 2 B man 14 spain
## 3 C man 25 spain
Borrar filas con valores nulos
datos <- na.omit(datos)
Ordenar datos por filas
Ordenar de forma ascendente
arrange(datos, edad, nombre )
## nombre sexo edad pais
## 1 E man 12 italy
## 2 B man 14 spain
## 3 A man 25 spain
## 4 C man 25 spain
## 5 J woman 43 portugal
## 6 H woman 45 portugal
## 7 I woman 56 portugal
## 8 G woman 65 portugal
## 9 D man 76 italy
## 10 F woman 90 italy
Ordenar de forma descendente
arrange(datos, desc(edad), nombre )
## nombre sexo edad pais
## 1 F woman 90 italy
## 2 D man 76 italy
## 3 G woman 65 portugal
## 4 I woman 56 portugal
## 5 H woman 45 portugal
## 6 J woman 43 portugal
## 7 A man 25 spain
## 8 C man 25 spain
## 9 B man 14 spain
## 10 E man 12 italy
Seleccionar por columnas
Seleccionar ciertas columnas concreto
select(datos, nombre, edad, pais)
## nombre edad pais
## 1 A 25 spain
## 2 B 14 spain
## 3 C 25 spain
## 4 D 76 italy
## 5 E 12 italy
## 6 F 90 italy
## 7 G 65 portugal
## 8 H 45 portugal
## 9 I 56 portugal
## 10 J 43 portugal
Seleccionar un rango de columnas
select(datos, nombre:edad)
## nombre sexo edad
## 1 A man 25
## 2 B man 14
## 3 C man 25
## 4 D man 76
## 5 E man 12
## 6 F woman 90
## 7 G woman 65
## 8 H woman 45
## 9 I woman 56
## 10 J woman 43
Excluir un rango de columnas
select(datos, -(nombre:edad))
## pais
## 1 spain
## 2 spain
## 3 spain
## 4 italy
## 5 italy
## 6 italy
## 7 portugal
## 8 portugal
## 9 portugal
## 10 portugal
Seleccionar ciertas columnas y renombrarlas
select(datos, new.nombre= nombre, new.edad = edad)
## new.nombre new.edad
## 1 A 25
## 2 B 14
## 3 C 25
## 4 D 76
## 5 E 12
## 6 F 90
## 7 G 65
## 8 H 45
## 9 I 56
## 10 J 43
Renombrar columnas
Renombrar columnas de forma simple
rename(datos, new.nombre= nombre, new.edad = edad)
## new.nombre sexo new.edad pais
## 1 A man 25 spain
## 2 B man 14 spain
## 3 C man 25 spain
## 4 D man 76 italy
## 5 E man 12 italy
## 6 F woman 90 italy
## 7 G woman 65 portugal
## 8 H woman 45 portugal
## 9 I woman 56 portugal
## 10 J woman 43 portugal
Seleccionar ciertas columnas y renombrarlas
select(datos, new.nombre= nombre, new.edad = edad)
## new.nombre new.edad
## 1 A 25
## 2 B 14
## 3 C 25
## 4 D 76
## 5 E 12
## 6 F 90
## 7 G 65
## 8 H 45
## 9 I 56
## 10 J 43
Seleccionar y quedarse con las filas de valores no repetidos (unique)
distinct(datos, pais)
## pais
## 1 spain
## 2 italy
## 3 portugal
distinct(datos, sexo, pais)
## sexo pais
## 1 man spain
## 2 man italy
## 3 woman italy
## 4 woman portugal
Insertar nuevas columnas
Insertar nuevas columnas a las ya existentes
mutate(datos,
nacimiento = 2017 - edad
)
## nombre sexo edad pais nacimiento
## 1 A man 25 spain 1992
## 2 B man 14 spain 2003
## 3 C man 25 spain 1992
## 4 D man 76 italy 1941
## 5 E man 12 italy 2005
## 6 F woman 90 italy 1927
## 7 G woman 65 portugal 1952
## 8 H woman 45 portugal 1972
## 9 I woman 56 portugal 1961
## 10 J woman 43 portugal 1974
Crear un nuevo dataframe con las columnas nuevas
transmute(datos,
nacimiento = 2017 - edad,
new.pais = paste("my county is ", pais)
)
## nacimiento new.pais
## 1 1992 my county is spain
## 2 2003 my county is spain
## 3 1992 my county is spain
## 4 1941 my county is italy
## 5 2005 my county is italy
## 6 1927 my county is italy
## 7 1952 my county is portugal
## 8 1972 my county is portugal
## 9 1961 my county is portugal
## 10 1974 my county is portugal
Resumir la información
summarise(datos,
delay = mean(edad, na.rm = TRUE)
)
## delay
## 1 45.1
Agrupar información por sus variables
Agrupar datos por sexo
grupos <- group_by(datos, sexo)
summarise(grupos,
num = n()
)
## # A tibble: 2 × 2
## sexo num
## <fctr> <int>
## 1 man 5
## 2 woman 5
Agrupar datos por sexo determinando cuantos países hay distintos de cada grupo
summarise(grupos,
paises = n_distinct(pais),
num = n()
)
## # A tibble: 2 × 3
## sexo paises num
## <fctr> <int> <int>
## 1 man 2 5
## 2 woman 2 5
Agrupar por sexo y mostrar el primer país de cada grupo
summarise(grupos,
pais1 = first(pais),
num = n()
)
## # A tibble: 2 × 3
## sexo pais1 num
## <fctr> <fctr> <int>
## 1 man spain 5
## 2 woman italy 5
Agrupar por sexo y mostrar el último país de cada grupo
summarise(grupos,
paisN = last(pais),
num = n()
)
## # A tibble: 2 × 3
## sexo paisN num
## <fctr> <fctr> <int>
## 1 man italy 5
## 2 woman portugal 5
Agrupar por sexo y mostrar el N país de cada grupo
summarise(grupos,
pais2 = nth(pais,2),
num = n()
)
## # A tibble: 2 × 3
## sexo pais2 num
## <fctr> <fctr> <int>
## 1 man spain 5
## 2 woman portugal 5
Agrupación de sentencias que manipulan datos
Mediante variables
a1 <- group_by(datos, pais)
a2 <- select(a1, sexo:pais)
a3 <- summarise(a2, media.edad = mean(edad, na.rm = TRUE))
a4 <- filter(a3, media.edad > 25 & media.edad < 80)
Mediante llaves donde unas sentencias incluyan a otras
filter(
summarise(
select(
group_by(datos, pais),
sexo:pais
),
media.edad = mean(edad, na.rm = TRUE)
),
media.edad > 25 & media.edad < 80
)
## # A tibble: 2 × 2
## pais media.edad
## <fctr> <dbl>
## 1 italy 59.33333
## 2 portugal 52.25000
Mediante el operador %>%
datos %>%
group_by(pais) %>%
select(sexo:pais) %>%
summarise(media.edad = mean(edad, na.rm = TRUE)) %>%
filter (media.edad > 25 & media.edad < 80)
## # A tibble: 2 × 2
## pais media.edad
## <fctr> <dbl>
## 1 italy 59.33333
## 2 portugal 52.25000
Unión de dos tablas
id <- c (1:10) valor1 <- c("A","B","C","D","E","F","G","H","I","J") valor2 <- c(rep("spain",3),rep("italy",3),rep("portugal",4)) datos1 <- data.frame(id=id,valor1= valor1) datos2 <- data.frame(id=id,valor2= valor2) head(datos1) head(datos2) #install.packages("nycflights13") library("nycflights13") join <- datos1 %>% left_join(datos2, by="id") head(join) # id valor1 valor2 # 1 A spain # 2 B spain # 3 C spain # 4 D italy # 5 E italy # 6 F italy
Seleccionar los n primeros valores
nombre <- c("A","B","C","D","E","F","G","H","I","J")
sexo <- c(rep("man",5),rep("woman",5))
datos <- data.frame(nombre=nombre,sexo=sexo)
datos %>% filter(row_number() <= 3)
Reemplazar valores de una columna
nombre <- c("A","B","C","D","E","F","G","H","I","J")
valor <- c("X", 2, 3, NA, NA, NA, 3, 2, 1, 0)
datos <- data.frame(nombre,valor)
# Reemplazar NA
datos <- datos %>% mutate(valor = replace(valor, which(is.na(valor)), 0))
# Reemplazar cadenas de caracteres por nunero
datos <- datos %>% mutate(valor = replace(valor, valor == "X", 0))
# Reemplazar cadenas de caracteres por otra
levels(datos$valor) <- c(levels(datos$valor),"Nueva")
datos <- datos %>% mutate(valor = replace(valor, valor == "X", "Nueva"))
Nota: Si existien problemas de compatibilidad con el paquete «plyr» ejecutar el siguiente comando:
Error: This function should not be called directly
Solución: detach("package:plyr", unload=TRUE)
Información muy importante, sirve de mucho para procesar datos.
Gracias.
buenos ejemplos
Hola, estoy intentando encontrar una función que me permita cambiar el nombre de un directorio usando R. ¿Puedes orientarme?
Muchas gracias
Buenos días, tengo un df con una serie de filas con caracteres de respuestas tipo likert. «Totalmente de acuerdo», «En acuerdo», ni en acuerdo ni en desacuerdo», «en desacuerdo», «Totalmente en desacuerdo».
Quiera remplazar los caracteres por 6, 5, 4, 3, 2, 1.
Use la función: datos % mutate(valor = replace(valor, valor == «X», 0))
Pero esto solo permitió remplazar un solo valor, trate de usar la función varias veces pero no obtuve el resultado deseado remplazando los 6 valores
¿Es posible hacer el remplazo de todos los valores? Y que quede correcto
Muchas gracias por su ayuda
Muchas gracias por el blog, muy interesante.
Estoy buscando dividir el texto de una columna por determinado caracter, en el caso particular el caracter es: «|»
Los valores de la columna son:
a|b|c
Busco dividir en varias columnas por el caracter «|»
¿Sabes si es posible?
Hola,
gracias por los ejemplos.
Si me podria ayudar con reemplazar varios valores de una misma columna.
tengo mas de 500000 filas en 22 grupos codificados en numeros (ej. c(9941,9945, 9950, …)), entonces quisiera a esos valores numericos reemplazarlos a letras (ej, AAA, BBB, CCC, ….). he estado probando sus ejemplo pero no me sale.
Muchas gracias de antemano.
Buenas!! Van mis consultas de Dummies 🙂
Tengo una base que en una de sus columnas tiene DNIs. He identificado errores y quisiera modificarlos con un script de R. Como puedo hacer un replace masivo?
En este ejemplo se remplaza X por 0
datos % mutate(valor = replace(valor, valor == «X», 0))
pero si quisiera replazar 100 DNIs por otros 100 como se podria hacer?
Espero que puedan ayudarme
Abrazo
Buenas tardes Diego. Estoy tratando de resolver un problema y no doy bien con las instrucciones. Basicamnete si tengo un data.frame de este tipo
A, B. C, D, E
A, B. C, D, F
A, B. C, D, G
….
V, W, X, Y, Z
y la pareja de valores A, G
como puedo quitar o marcar las filas que tengan esos dos valores?
Gracias
Hola, Diego! Y si quieséramos seleccionar las filas en las que todos sus valores son iguales a x? Por ejemplo: seleccionar las filas en las que todos sus valores son iguales a 0. Cómo podríamos hacerlo?
Hola. En este caso es reemplazar un caracter por un valor numérico, pero en el caso de querer reemplazar un valor numérico por otro, ¿cuál sería la sintaxis?
Otimo mateial.