开发者

Define quadrant based on positive/negative values in two columns

I have a data set with two columns of positive and negative numbers. I would like to create a third column that reflects which quadrant they would appear in if plotted in Cartesian space.

For example, if Column A is positive, and Column B is positive, the开发者_JAVA技巧n Column C would record "I." If column A is negative, and Column B is negative, then Column C would record "III," and so on.

I suspect I can do this with an if else function and then loop or apply it across rows in the data set, but my attempts to write the if else have so far failed.


Well, the following would give you values between 1 and 4:

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

This transforms the whole column in one go. The magic lies in that FALSE/TRUE is treated as 0/1, and you can do math on it. By using 2L and 1L instead of 2 and 1, you keep the result as integers instead of forcing a coercion to doubles (which is slower and takes more memory).

Then assuming you want to map to these quadrants:

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

You could use this (updated to use a 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

...and if you want the quadrants mapped differently, just change the order of the labels in quadrantNames.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜