Определить квадрант на основе положительных / отрицательных значений в двух столбцах - PullRequest
2 голосов
/ 18 июля 2011

У меня есть набор данных с двумя столбцами положительных и отрицательных чисел. Я хотел бы создать третий столбец, в котором будет отображаться, в каком квадранте они будут отображаться в декартовом пространстве.

Например, если столбец A положительный, а столбец B положительный, то в столбце C будет записано «I.» Если столбец A отрицательный, а столбец B отрицательный, то в столбец C будет записано «III» и т. Д.

Я подозреваю, что могу сделать это с помощью функции if else, а затем loop или apply по строкам в наборе данных, но мои попытки записать if else пока не увенчались успехом.

1 Ответ

2 голосов
/ 18 июля 2011

Хорошо, следующее даст вам значения от 1 до 4:

C <- (A<0) + (B<0)*2L + 1L

Это превращает весь столбец за один раз. Волшебство заключается в том, что ЛОЖЬ / ИСТИНА трактуется как 0/1, и вы можете делать математику на нем. Используя 2L и 1L вместо 2 и 1, вы сохраняете результат в виде целых чисел вместо принудительного приведения к удвоениям (что медленнее и занимает больше памяти).

Затем при условии, что вы хотите отобразить следующие сектора:

       +B
        |
     II | I
-A -----+---- +A
    III | IV
        |
       -B

Вы можете использовать это (обновлено для использования data.frame):

# Sample data.frame with columns a & b
d <- data.frame(a=c(1,-1,-1,1), b=c(1,1,-1,-1))

quadrantNames <-  c('I', 'II', 'IV', 'III') # Your labels...
d <- within(d, c <- quadrantNames[(a<0) + (b<0)*2L + 1L])
head(d) # print data
   a  b   c
1  1  1   I
2 -1  1  II
3 -1 -1 III
4  1 -1  IV

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

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