我有一个包含两列正数和负数的数据集。我想创建一个第三列,反映如果在笛卡尔空间中绘制它们将出现在哪个象限。
例如,如果A列为正,而B列为正,则C列将记录“I”。如果A列为负数,B列为负数,则C列将记录“III”,依此类推。
我怀疑我可以使用if else
函数执行此操作,然后loop
或apply
使用数据集中的行,但我尝试编写if else
到目前为止失败了
答案 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
中标签的顺序。