Saltar al contenido

Pegar valores condicionalmente de una columna a otra en R

No dejes de compartir nuestro espacio y códigos con otro, necesitamos de tu ayuda para hacer crecer nuestra comunidad.

Solución:

Puede intentar girarlo a largo, hacer su transformación y luego girarlo nuevamente hacia atrás.

library(dplyr)
library(tidyr)

url_col_names <- c("home", "login", "product_page")

df %>% 
  pivot_longer(url_col_names, names_to = "url", values_to = "url_duration") %>% 
  mutate(url_duration = url_duration * duration) %>% 
  pivot_wider(names_from = "url", values_from = "url_duration")
# A tibble: 6 x 7
     ID URL_visit URL_name     duration  home login product_page
                             
1     1         1 home               14    14     0            0
2     1         2 login              40     0    40            0
3     1         3 product_page      233     0     0          233
4     2         1 home                8     8     0            0
5     3         1 home               76    76     0            0
6     3         2 product_page      561     0     0          561

Otra forma, probablemente más sencilla, es hacer esto.

df %>% 
  mutate(across(any_of(url_col_names), ~ . * duration))
  ID URL_visit     URL_name duration home login product_page
1  1         1         home       14   14     0            0
2  1         2        login       40    0    40            0
3  1         3 product_page      233    0     0          233
4  2         1         home        8    8     0            0
5  3         1         home       76   76     0            0
6  3         2 product_page      561    0     0          561

Editar

En otra nota, me imagino que creó esas variables indicadoras. Si solo espera reemplazarlos, es posible que no necesite crearlos para empezar. Tu puedes sólo pivot_wider() desde el comienzo.

Esto supondría que tu ID y URL_visit las columnas forman una combinación de filas única.

df2 <- df[, 1:4]

df2 %>% 
  pivot_wider(names_from = "URL_name", values_from = "duration", values_fill = 0)

Una simple multiplicación debería funcionar (esto es equivalente a la solución tidyverse de @Adam anterior pero en base R)

url_col_names <- c('home','login','product_page')    
df$duration * df[,url_col_names] -> df[,url_col_names]

Para cambiar el nombre de las columnas, puede hacer:

names(df)[names(df) %in% url_col_names] <- paste0(url_col_names, '_', 'duration')
          

Similar a @Adam, across() se puede utilizar con ifelse() para calcular variables usando una estructura similar a la mencionada por el usuario:

library(dplyr)
#Data
df <- data.frame("ID" = c(1, 1, 1, 2, 3, 3),  
                 "URL_visit" = c(1, 2, 3, 1, 1, 2), # e.g. customer ID #1 has visited 3 pages
                 "URL_name" = c("home", "login", "product_page", "home", "home", "product_page"),
                 "duration" = c(14, 40, 233, 8, 76, 561),
                 "home" = c(1, 0, 0, 1, 1, 0),
                 "login" = c(0, 1, 0, 0, 0, 0), 
                 "product_page" = c(0, 0, 1, 0, 0, 1)
)
#Code
df %>%
  mutate(across(c(home:product_page), ~ ifelse(.==1, duration, .)))

Producción:

  ID URL_visit     URL_name duration home login product_page
1  1         1         home       14   14     0            0
2  1         2        login       40    0    40            0
3  1         3 product_page      233    0     0          233
4  2         1         home        8    8     0            0
5  3         1         home       76   76     0            0
6  3         2 product_page      561    0     0          561

Además, si es necesario mantener las variables originales, este código puede ayudar:

df %>%
  mutate(across(c(home:product_page),.fns = list(duration = ~ ifelse(.==1, duration, .)) ))

Producción:

  ID URL_visit     URL_name duration home login product_page home_duration login_duration
1  1         1         home       14    1     0            0            14              0
2  1         2        login       40    0     1            0             0             40
3  1         3 product_page      233    0     0            1             0              0
4  2         1         home        8    1     0            0             8              0
5  3         1         home       76    1     0            0            76              0
6  3         2 product_page      561    0     0            1             0              0
  product_page_duration
1                     0
2                     0
3                   233
4                     0
5                     0
6                   561

Sección de Reseñas y Valoraciones

Nos encantaría que puedieras comunicar esta sección si lograste el éxito.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *