Создайте два новых столбца в зависимости от шаблона в другом - PullRequest
2 голосов
/ 28 апреля 2020

Здравствуйте, у меня есть фрейм данных, такой как

   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    +

, и вот идея, для каждой строки, если Знак равен -, тогда выполните:

Len-Col2 > NewCol3
Len-Col3 > NewCol2

example

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

и получите:

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

Спасибо за помощь

Ответы [ 3 ]

3 голосов
/ 28 апреля 2020

Здесь мы можем использовать case_when

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

data

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))
2 голосов
/ 28 апреля 2020

Вот базовое решение R

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

, которое дает

> 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

Данные

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))
1 голос
/ 28 апреля 2020

Простое решение с базой R:

Предположим, ваш фрейм данных называется 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...