Hola, tengo un marco de datos como

   ColG Col2 Col3 Len    Sign
    G1   1    30   300    +
    G2   20   80   200    +
    G3   455  720  1000   -
    G4   3    40   100    -
    G4   2    90   130    +

Y aquí está la idea, para cada fila, si el signo es -, entonces haga:

Len-Col2 > NewCol3
Len-Col3 > NewCol2

Ejemplo

1000-720=280
1000-455=545
100-40=60
100-3=97

Y obten :

ColG Col2 Col3 Len    Sign NewCol2  NewCol3
G1   1    30   300    +    1        30
G2   20   80   200    +    20       80
G3   455  720  1000   -    280      545
G4   3    40   100    -    60       97
G4   2    90   130    +    2        90

Gracias por su ayuda

r
2
Grendel 28 abr. 2020 a las 23:17

3 respuestas

La mejor respuesta

Aquí, podemos usar case_when

library(dplyr)
df1 %>%
   mutate(NewCol2 = case_when(Sign == '+' ~ Col2, TRUE ~ Len - Col3),
          NewCol3 = case_when(Sign == '-' ~ Len - Col2, TRUE ~ Col3)
          )

Datos

df1 <- structure(list(ColG = c("G1", "G2", "G3", "G4", "G4"), Col2 = c(1L, 
20L, 455L, 3L, 2L), Col3 = c(30L, 80L, 720L, 40L, 90L), Len = c(300L, 
200L, 1000L, 100L, 130L), Sign = c("+", "+", "-", "-", "+")), 
class = "data.frame", row.names = c(NA, 
-5L))
3
akrun 28 abr. 2020 a las 20:25

Aquí hay una solución base R

dfout <- within(df, New <- rev((Sign=="-")*(Len-cbind(Col2,Col3))) + (Sign=="+")*cbind(Col2,Col3))

Que da

> dfout
  ColG Col2 Col3  Len Sign New.Col2 New.Col3
1   G1    1   30  300    +        1       30
2   G2   20   80  200    +       20       80
3   G3  455  720 1000    -      280      545
4   G4    3   40  100    -       60       97
5   G4    2   90  130    +        2       90

Datos

df <- structure(list(ColG = c("G1", "G2", "G3", "G4", "G4"), Col2 = c(1L, 
20L, 455L, 3L, 2L), Col3 = c(30L, 80L, 720L, 40L, 90L), Len = c(300L, 
200L, 1000L, 100L, 130L), Sign = c("+", "+", "-", "-", "+")), class = "data.frame", row.names = c(NA, 
-5L))
2
ThomasIsCoding 28 abr. 2020 a las 20:42

Una solución simple con base R:

Supongamos que su marco de datos se llama df:


transform(df,
          NewCol2 = ifelse(Sign == "-", Len-Col3, Col2),               
          NewCol3 = ifelse(Sign == "-", Len-Col2, Col3)
          )

# ColG Col2 Col3  Len Sign NewCol2 NewCol3
# 1   G1    1   30  300    +       1      30
# 2   G2   20   80  200    +      20      80
# 3   G3  455  720 1000    -     280     545
# 4   G4    3   40  100    -      60      97
# 5   G4    2   90  130    +       2      90
1
Pedro 28 abr. 2020 a las 20:52