根据两列中的正/负值定义象限

时间:2011-07-18 19:18:00

标签: function r loops if-statement

我有一个包含两列正数和负数的数据集。我想创建一个第三列,反映如果在笛卡尔空间中绘制它们将出现在哪个象限。

例如,如果A列为正,而B列为正,则C列将记录“I”。如果A列为负数,B列为负数,则C列将记录“III”,依此类推。

我怀疑我可以使用if else函数执行此操作,然后loopapply使用数据集中的行,但我尝试编写if else到目前为止失败了

1 个答案:

答案 0 :(得分:2)

好吧,以下内容会给你1到4之间的值:

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

这将一次性转换整个列。神奇之处在于FALSE / TRUE被视为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中标签的顺序。