x1 <- c("agree","disagree","agree","agree","agree","disagree","disagree")
Как заменить agree=1
и disagree=0
для больших атомных векторов или конкретных строк/столбцов в кадре данных?Найти и заменить в R для категориальных переменных
x1 <- c("agree","disagree","agree","agree","agree","disagree","disagree")
Как заменить agree=1
и disagree=0
для больших атомных векторов или конкретных строк/столбцов в кадре данных?Найти и заменить в R для категориальных переменных
Вы можете сделать что-то вроде этого
ifelse(x1 == 'agree', 1, 0)
Дополнительные условия могут быть добавлены по мере необходимости.
Хотя это работает (и это мой предпочтительный вариант в этом простом случае), добавление дополнительных опций на самом деле довольно хлопот; это решение, таким образом, не очень хорошо масштабируется за пределами двух значений. 'switch' облегчает это, но лишь несколько, так как функция ограничена очень конкретным вводом. Более общим решением в R является использование факторов. –
Да, as.factor() - правильный способ обработки категориальных данных. Но вопрос был очень конкретным. – Gopala
Мы можем использовать +
для преобразования логической двоичной
+(x1=="agree")
Или с помощью as.integer
(согласно комментариям)
as.integer(x1 == "agree")
Этот метод намного быстрее, чем ifelse
.
set.seed(24)
x2 <- sample(c("agree", "disagree"), 1e7, replace=TRUE)
system.time(+(x2=="agree"))
# user system elapsed
# 0.32 0.06 0.40
system.time(ifelse(x2=="agree", 1,0))
# user system elapsed
# 3.20 0.91 4.10
Мне нужно привыкнуть к началу заявления с помощью +. :) – Gopala
@ user3949008 - Нет, ты действительно не должен. 'as.integer()' более подходит. –
«Не нужно», конечно. Но нет необходимости в вашем решении, которое, в конце концов, намного менее явное и, следовательно, менее читаемое, и полагается на чисто случайное преобразование типа для достижения желаемого эффекта. Другими словами, слишком «умный». Я ** действительно ** препятствую этому решению. Знайте об этом, если хотите. Просто никогда не используйте его. –
Некоторые дубликаты, чтобы вы начали: [дублировать 1] (http://stackoverflow.com/q/3905038/903061), [дублировать 2] (http://stackoverflow.com/q/29562455/ 903061), [duplicate 3] (http://stackoverflow.com/q/17717864/903061), также см. '? Replace' или'? Factor'. – Gregor