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

发布于 2024-11-24 20:20:22 字数 221 浏览 1 评论 0原文

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

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

我怀疑我可以使用 if else 函数来完成此操作,然后在数据集中的行中循环或应用它,但我尝试编写if else 到目前为止已经失败。

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, then 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.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

姜生凉生 2024-12-01 20:20:22

那么,下面将为您提供 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.

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文