【问题标题】:R: non-numeric arguments to binary operatorsR:二元运算符的非数字参数
【发布时间】:2021-01-21 22:12:06
【问题描述】:

我正在使用 R 编程语言。我正在尝试使用一些假数据制作“平行坐标图”:

library(MASS)

a = rnorm(100, 10, 10)

b = rnorm(100, 10, 5)

c = rnorm(100, 5, 10)

d = matrix(a, b, c)

parcoord(d[, c(3, 1, 2)], col = 1 + (0:149) %/% 50)

但是,当我尝试将数值变量和因子变量混合在一起时会出现问题:

group <- sample( LETTERS[1:4], 100, replace=TRUE, prob=c(0.25, 0.25, 0.25, 0.25) )
d = matrix(a,b, group)
 parcoord(d[, c(3, 1, 2)], col = 1 + (0:149) %/% 50)

Error in x - min(x, na.rm = TRUE): non-numeric argument to binary operator

我只是好奇。这个问题能解决吗?还是根本不可能同时使用数字和因子变量来制作这样的图?

我在这里看到了以前的 stackoverflow 帖子,其中使用数字和因子变量制作了类似的图:How to plot parallel coordinates with multiple categorical variables in R

但是,我使用的是没有 USB 端口或互联网接入的计算机 - 我有一个带有有限库的 R 的预安装版本(我有 plotly、ggplot2、dplyr、MASS ......我没有 ggally 或tidyverse) 并且正在寻找一种仅使用 parcoord() 函数来执行此操作的方法。

如果可以做到这一点,有人有什么想法吗? 谢谢

谢谢

【问题讨论】:

  • 这段代码有几个部分会抛出错误。您列出的错误来自尝试对没有数值的事物进行“数学运算”,例如"a character string" - "a character string"。此示例中的子集仍然是错误的,这是您上一个问题中的问题。我建议你花一些时间学习 R 的基础知识。
  • 我不想让你气馁 - 在这里非常欢迎你。只是这个问题没有真正的意义,很明显你不了解R的一些基本语法。也许你可以看看这些资源:education.rstudio.com/learn/beginner

标签: r plot data-visualization data-manipulation


【解决方案1】:

一种选择是使用一个因子标记矩阵的行并在图上使用它,例如

library(MASS)
set.seed(300)
par(xpd=TRUE)
par(mar=c(4, 4, 4, 6))
a = rnorm(12, 10, 10)
b = rnorm(12, 10, 5)
c = rnorm(12, 5, 10)
group <- sample(c("#FF9289", "#FF8AFF", "#00DB98", "#00CBFF"),
                12, replace=TRUE)

d = cbind(a, b, c)
rownames(d) <- group

parcoord(d[, c(3, 1, 2)], col = group)
title(main = "Plot", xlab = "Variable", ylab = "Values")
axis(side = 2, at = seq(0, 1, 0.1),
     tick = TRUE, las = 1)
legend(3.05, 1, legend = c("A", "B", "C", "D"), lty = 1,
       col = c("#FF9289", "#FF8AFF", "#00DB98", "#00CBFF"))

编辑

感谢您的补充说明。你想要的确实有意义,但不幸的是它看起来不像我预期的那样工作。我尝试使用有序因子作为中间变量(根据https://pasteboard.co/JKK4AUD.jpg)绘制图,但得到了相同的错误(“二元运算符的非数字参数”)。

我想到的一种方法是将因子重新编码为数字(例如“Var_1”-> 0.2、“Var_2”-> 0.4),如下所示:

library(MASS)
set.seed(123)
par(xpd=TRUE)
par(mar=c(4, 4, 4, 6))
a = rnorm(12, 10, 10)
b = c(rep("Var_1", 3),
      rep("Var_2", 3),
      rep("Var_3", 3),
      rep("Var_4", 3))
c = rnorm(12, 5, 10)
group <- c(rep("#FF9289", 3),
           rep("#FF8AFF", 3),
           rep("#00DB98", 3),
           rep("#00CBFF", 3))

d = data.frame("A" = a,
               "Factor" = b,
               "C" = c,
               "Group" = group)

d$Factor <- sapply(d$Factor, switch,
                   "Var_1" = 0.8,
                   "Var_2" = 0.6,
                   "Var_3" = 0.4,
                   "Var_4" = 0.2)

parcoord(d[, c(1, 2, 3)], col = group)
title(main = "Plot", xlab = "Variable", ylab = "Values")
axis(side = 2, at = seq(0, 1, 0.1),
     tick = TRUE, las = 1)
legend(3.05, 1, legend = c("A", "B", "C", "D"), lty = 1,
       col = c("#FF9289", "#FF8AFF", "#00DB98", "#00CBFF"))
mtext(text = "Var 1", side = 1, adj = 0.6, padj = -30)
mtext(text = "Var 3", side = 1, adj = 0.6, padj = -12)
mtext(text = "Var 2", side = 1, adj = 0.6, padj = -21)
mtext(text = "Var 4", side = 1, adj = 0.6, padj = -3)

【讨论】:

  • 感谢您的回复!我正在尝试做这样的事情:pasteboard.co/JKK4AUD.jpg。你觉得这可能吗?
  • 是的,我认为如果您使用有序因子(即 1 = 'category 1'、2 = 'category 2'、3 = 'category 4')是可能的。等我下班后我会想办法解决的
  • 试一试 - 这符合您的目的吗?
  • 谢谢!我还在想办法
猜你喜欢
  • 1970-01-01
  • 2022-01-27
  • 2015-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-15
  • 1970-01-01
  • 2018-08-24
相关资源
最近更新 更多