Использование If/Else в кадре данных

У меня есть набор данных, который выглядит примерно как

data<-c(0,1,2,3,4,2,3,1,4,3,2,4,0,1,2,0,2,1,2,0,4)
frame<-as.data.frame(data)

Теперь я хочу создать новую переменную в этом фрейме данных. Если столбец "данные" сообщает о количестве 2 или более, я хочу, чтобы он имел "2" в этой строке, и если есть 1 или 0 (например, первые два наблюдения), я хочу, чтобы новая переменная имела "1" для этого наблюдения.

Я пытаюсь сделать это, используя следующий код:

frame$twohouses<- if (any(frame$data>=2)) {frame$twohouses=2} else {frame$twohouses=1}

Однако, если я запустил эти 3 строки script, каждое наблюдение в столбце "два дома" закодировано с помощью 2. Однако некоторые из них должны быть закодированы с помощью 1.

Итак, мой вопрос: что я делаю неправильно с моей линией if else или script? Или есть альтернативный способ сделать это.

Мой вопрос похож на этот: Использование ifelse по коэффициенту в R

но никто не ответил на этот вопрос.

Большое спасибо заранее!

Ответы

Ответ 1

Используйте ifelse:

frame$twohouses <- ifelse(frame$data>=2, 2, 1)
frame
   data twohouses
1     0         1
2     1         1
3     2         2
4     3         2
5     4         2
...
16    0         1
17    2         2
18    1         1
19    2         2
20    0         1
21    4         2

Разница между if и ifelse:

  • if - это оператор потока управления, принимающий одно логическое значение в качестве аргумента
  • ifelse - это векторизованная функция, принимающая векторы как все ее аргументы.

Страница справки if, доступная через ?"if", также укажет на ?ifelse

Ответ 2

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

frame$twohouses <- ifelse(frame$data>1, 2, 1)
 frame
   data twohouses
1     0         1
2     1         1
3     2         2
4     3         2
5     4         2
6     2         2
7     3         2
8     1         1
9     4         2
10    3         2
11    2         2
12    4         2
13    0         1
14    1         1
15    2         2
16    0         1
17    2         2
18    1         1
19    2         2
20    0         1
21    4         2