开发者

Define quadrant based on positive/negative values in two columns

开发者 https://www.devze.com 2023-03-20 22:56 出处:网络
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.

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

精彩评论

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

关注公众号