Предполагая, что small_vehicle
и large_vehicle
являются взаимоисключающими и исчерпывающими категориями, мы можем создать Combined
без логики if / then c следующим образом.
small_vehicle <- c(1,0,0,1,1,1,0)
large_vehicle <- c(0,1,1,0,0,0,1)
TRIdata <- data.frame(small_vehicle,large_vehicle)
TRIdata$Combined <- 2*TRIdata$large_vehicle + small_vehicle
TRIdata
... и вывод:
> TRIdata
small_vehicle large_vehicle Combined
1 1 0 1
2 0 1 2
3 0 1 2
4 1 0 1
5 1 0 1
6 1 0 1
7 0 1 2
>
Альтернативный подход
Мы можем сделать то же самое с ifelse()
.
# alternate approach
small_vehicle <- c(1,0,0,1,1,1,0)
large_vehicle <- c(0,1,1,0,0,0,1)
TRIdata <- data.frame(small_vehicle,large_vehicle)
TRIdata$Combined <- ifelse(TRIdata$small_vehicle == 1,1,2)
TRIdata
... и вывод.
> TRIdata
small_vehicle large_vehicle Combined
1 1 0 1
2 0 1 2
3 0 1 2
4 1 0 1
5 1 0 1
6 1 0 1
7 0 1 2
>
Почему оригинальный код не работает?
Я проиллюстрирую свой комментарий к исходному сообщению следующим кодом. Мы исправим ошибку =
против ==
в оригинале и попытаемся ее запустить.
# original code with my sample data
small_vehicle <- c(1,0,0,1,1,1,0)
large_vehicle <- c(0,1,1,0,0,0,1)
TRIdata <- data.frame(Small_Vehicle = small_vehicle,
Large_Vehicle = large_vehicle)
if (TRIdata$Small_Vehicle == 1) {
TRIdata$Combined <- 1
} else {
if (TRIdata$Large_Vehicle == 1) {
TRIdata$Combined <- 2
} else {
TRIdata$Combined <- NA
}
}
... выдает следующее предупреждение:
Warning message:
In if (TRIdata$Small_Vehicle == 1) { :
the condition has length > 1 and only the first element will be used
>
Когда мы печатаем результаты, мы видим, что R оценил первый элемент TRIdata$Small_Vehicle
как TRUE и присвоил значение 1 для каждого элемента в TRIdata$Combined
.
> TRIdata
Small_Vehicle Large_Vehicle Combined
1 1 0 1
2 0 1 1
3 0 1 1
4 1 0 1
5 1 0 1
6 1 0 1
7 0 1 1
>