Возьмите разницу между переменными, чтобы создать новую переменную, если они не совпадают - PullRequest
0 голосов
/ 07 октября 2018
test <- data.frame('cost'= c(120, 3, 2, 4, 10, 110, 200, 43, 1, 51, 22, 14),
               'price' = c(120, 20, 10, 4, 3, 4, 30, 43, 56, 88, 75, 44)
                )
test

    > test
   cost price
1   120   120
2     3    20
3     2    10
4     4     4
5    10     3
6   110     4
7   200    30
8    43    43
9     1    56
10   51    88
11   22    75
12   14    44

Я пытаюсь создать новую переменную, которая принимает разницу между двумя столбцами, если они не совпадают, и если они совпадают, то возвращается значение, которое имеют оба столбца.

Desired:
   cost price NewVar
1   120   120   120
2     3    20   -17
3     2    10   -8
4     4     4    4
5    10     3    7
6   110     4   106
7   200    30   170
8    43    43    43
9     1    56   -55
10   51    88   -37
11   22    75   -53
12   14    44   -30

Это то, что я пытался, но я получил ошибку, что пропустил аргумент ИСТИНА / ЛОЖЬ или что-то в этом роде.

test <- test %>%
        mutate(NewVar = if(cost==price) cost else cost - price)

Спасибо!

1 Ответ

0 голосов
/ 07 октября 2018

Мы можем использовать ifelse вместо if/else, так как if/else не векторизован и ожидает вектор длины 1. Здесь число строк больше 1, поэтому используйте векторизованный ifelse или if_else (из dplyr, который также проверяет type) или case_when

test$NewVar <- with(test, ifelse(cost == price, price, cost - price))
test$NewVar
#[1] 120 -17  -8   4   7 106 170  43 -55 -37 -53 -30

Или используя dplyr

library(dplyr)
test %>%
     mutate(NewVar = ifelse(cost == price, price, cost - price))

или case_when

test %>%
     mutate(NewVar = case_when(cost == price ~ price,
                      TRUE ~ cost -price))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...