Tengo DF1:

DF1 <- data.frame(Before = factor(c("Bad", "Bad", "Good", "Good", "Bad", "Bad")),
                 Now = factor(c("Good", "Good", "Good", "Bad", "Bad", "Good")))

Quiero crear un nuevo factor Change basado en los valores de los factores Before y Now, para que cambien de Bad en Before a {{X5} } en Now es Better en el nuevo factor y así sucesivamente:

DF2 <- data.frame(Before = factor(c("Bad", "Bad", "Good", "Good", "Bad", "Bad")),
                 Now = factor(c("Good", "Good", "Good", "Bad", "Bad", "Good")),
                 Change = factor(c("Better", "Better", "No change", "Worse", "No change", "Better")))

¿Cómo se puede lograr esto?

0
KaC 25 jun. 2020 a las 20:27

2 respuestas

La siguiente función crea una nueva columna dependiendo de los valores "Good" y "Bad".

change <- function(x, y){
  n <- length(x)
  x <- as.character(x)
  y <- as.character(y)
  out <- rep("Better", n)
  out[x == y] <- "No change"
  out[x > y] <- "Worse"
  out
}

DF2 <- DF1
DF2$Change <- change(DF2$Before, DF2$Now)

DF2
#  Before  Now    Change
#1    Bad Good    Better
#2    Bad Good    Better
#3   Good Good No change
#4   Good  Bad     Worse
#5    Bad  Bad No change
#6    Bad Good    Better

Esta función también puede estar en una tubería magrittr, con salida a DF2.

library(dplyr)

DF1 %>% mutate(Change = change(Before, Now)) -> DF2
0
Rui Barradas 25 jun. 2020 a las 17:47

Pruebe lo siguiente en la base R:

DF1$Change <- unlist(Map(function(x,y){
  if (x==y){
    return("No change")
  } else if (x=="Bad"){
    return("Better")
  } else {
    return("Worse")
  }
}, DF1$Before, DF1$Now))

O usando purrr:

DF1$Change <- unlist(purrr::map2( DF1$Before, DF1$Now, function(x,y){
  if (x==y){
    return("No change")
  } else if (x=="Bad"){
    return("Better")
  } else {
    return("Worse")
  }
}))

Salida:

> DF1
  Before  Now    Change
1    Bad Good    Better
2    Bad Good    Better
3   Good Good No change
4   Good  Bad     Worse
5    Bad  Bad No change
6    Bad Good    Better
0
slava-kohut 25 jun. 2020 a las 17:40