#r #dplyr
#r #dplyr
Вопрос:
Я пытаюсь сравнить каждую строку между 2 столбцами, используя dplyr
и mutate
.
Фрейм данных
df <- data.frame(ID = c("1234", "1234", "7491", "7319", "321", "321"),
add = c("1234", "1234", "749s1", "73a19", "321", "321"))
Изменить, если идентификатор столбца = добавить столбец, вернуть 1, иначе 0
df %>% mutate(TEST = ifelse(df$ID == df$add, 1, 0))
Однако приведенный выше код, похоже, не работает.
Обновление: Ошибка из-за уровней коэффициентов
Ответ №1:
Вы не поделились ошибкой, и я предполагаю, что это из-за factor
уровней. Вот обновленное решение.
library(dplyr)
#>
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#>
#> filter, lag
#> The following objects are masked from 'package:base':
#>
#> intersect, setdiff, setequal, union
df <- data.frame(ID = c("1234", "1234", "7491", "7319", "321", "321"),
add = c("1234", "1234", "749s1", "73a19", "321", "321"))
df %>% mutate(TEST = ifelse(as.character(ID) == as.character(add),1,0))
#> ID add TEST
#> 1 1234 1234 1
#> 2 1234 1234 1
#> 3 7491 749s1 0
#> 4 7319 73a19 0
#> 5 321 321 1
#> 6 321 321 1
Создано 2019-03-06 пакетом reprex (версия 0.2.1)
Вы можете еще больше упростить это с помощью as.numeric
:
library(dplyr)
#>
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#>
#> filter, lag
#> The following objects are masked from 'package:base':
#>
#> intersect, setdiff, setequal, union
df <- data.frame(ID = c("1234", "1234", "7491", "7319", "321", "321"),
add = c("1234", "1234", "749s1", "73a19", "321", "321"),
stringsAsFactors = FALSE)
df %>% mutate(TEST = as.numeric(ID == add))
#> ID add TEST
#> 1 1234 1234 1
#> 2 1234 1234 1
#> 3 7491 749s1 0
#> 4 7319 73a19 0
#> 5 321 321 1
#> 6 321 321 1
Создано 2019-03-06 пакетом reprex (версия 0.2.1)