R если еще код для объединения двух переменных в одну - PullRequest
1 голос
/ 25 апреля 2020

У меня есть две переменные - Small_Vehicle и Large_Vehicle, которые кодируются как 0 и 1. Я хочу объединить их в одну переменную, где, если транспортное средство было маленьким - 1, а если оно было большим - 2. Если нет данных, я хочу, чтобы R оставил как NA. Я написал код ниже, но он дает мне ошибку:

Ошибка: неожиданное '}' в "TRIdata $ Combined <- NA}" </p>

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

if (TRIdata$Small_Vehicle = 1) {
TRIdata$Combined<-1 } else {
if (TRIdata$Large_Vehicle=1)  {
TRIdata$Combined<-2 } else {
TRIdata$Combined <- NA }}

Есть ли у вас какие-либо предложения о том, что я делаю неправильно, пожалуйста?

Спасибо!

Ответы [ 2 ]

2 голосов
/ 25 апреля 2020

Предполагая, что 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
>
1 голос
/ 25 апреля 2020

Попробуйте это.

if (TRIdata$Small_Vehicle == 1) {
    TRIdata$Combined<-1 } elseif (TRIdata$Large_Vehicle=1) {
    TRIdata$Combined<-2 } else {
    TRIdata$Combined <- NA }
...