【问题标题】:Principal Components Analysis:Error in colMeans(x, na.rm = TRUE) : 'x' must be numeric主成分分析:colMeans(x,na.rm = TRUE)中的错误:“x”必须是数字
【发布时间】:2017-10-25 14:50:05
【问题描述】:

我正在尝试执行主成分分析,但出现错误:colMeans(x, na.rm = TRUE) 中的错误:'x' must be numeric

我知道所有列都必须是数字,但是当数据集中有字符对象时如何处理?例如:

data(birth.death.rates.1966)
data2 <- birth.death.rates.1966
princ <- prcomp(data2)
  • data2 以下数据示例:

我应该添加一个将国家名称与数字代码相关的新列吗?如果是,如何在 R 中执行此操作?

【问题讨论】:

    标签: r


    【解决方案1】:

    在 R 中,将 factor 方法添加到数据字符集中,不会使其成为数字。 确实是让我们的机器学习模型成为一个数学模型,但它不是数字数据。

    示例:如果您有一个名称列表,然后对它们进行数字编码,则某个名称可能具有更高的数值,这将根据我们的模型给出不同的定义。
    名称(仅用于标记特定集合的文本数据)通常不应该定义模型的工作方式。

    此外,如果您尝试使用此数据并假设它是数字,您可能会收到以下错误:

    colMeans(x, na.rm = TRUE) 中的错误:“x”必须是数字

    我已经解释了为什么你可能会在上面得到这个错误

    为了解决这个问题

    training_set[,2:3] = scale(training_set)
    test_set[,2:3] = scale(test_set)
    

    在下图中,第 1 列和第 4 列具有编码数据,不能被视为数字模型第 2 列和第 3 列最初包含数字数据,因此我们只能在这部分数据上运行模型。上面的代码只是展示了如何选择它包含所有行和列 2 和 3 的数据

    【讨论】:

    • 请将截图限制/裁剪到必要的区域并嵌入到帖子中。
    【解决方案2】:

    您可以通过factor 将字符向量转换为数值。然后每个唯一值都会得到一个唯一的整数代码。在这个例子中,有四个值,所以数字是 1 到 4,按字母顺序,我认为:

    > d = data.frame(country=c("foo","bar","baz","qux"),x=runif(4),y=runif(4))
    > d
      country          x         y
    1     foo 0.84435112 0.7022875
    2     bar 0.01343424 0.5019794
    3     baz 0.09815888 0.5832612
    4     qux 0.18397525 0.8049514
    > d$country = as.numeric(as.factor(d$country))
    > d
      country          x         y
    1       3 0.84435112 0.7022875
    2       1 0.01343424 0.5019794
    3       2 0.09815888 0.5832612
    4       4 0.18397525 0.8049514
    

    然后你可以运行prcomp:

    > prcomp(d)
    Standard deviations:
    [1] 1.308665216 0.339983614 0.009141194
    
    Rotation:
                   PC1          PC2          PC3
    country -0.9858920  0.132948161 -0.101694168
    x       -0.1331795 -0.991081523 -0.004541179
    y       -0.1013910  0.009066471  0.994805345
    

    这对您的应用程序是否有意义取决于您。也许您只想删除第一列:prcomp(d[,-1]) 并使用数字数据,这似乎是其他“答案”试图实现的目标。

    【讨论】:

      【解决方案3】:

      数据框的第一列是字符。因此,您可以将其重新编码为行名称:

      library(tidyverse)
      data2 %>% remove_rownames %>% column_to_rownames(var="country")
      princ <- prcomp(data2)
      

      或者:

      data2 <- data2[,-1]
      rownames(data2) <- data2[,1]
      princ <- prcomp(data2)
      

      【讨论】:

      • 请选择第二个选项。 tidyverse 解决方案更长,也需要更多时间。并非所有事物都是需要 tidyverse 锤子好好敲打的钉子。保留它以进行更复杂的数据操作,这确实会给您带来优势。
      • 正确地告诉@JorisMeys,tidyverse 更适合复杂数据
      • 并且这并没有回答将字符转换为数字的问题。
      • PCA 显然会在数字数据点上执行,因此将字符转换为数字。
      猜你喜欢
      • 2020-12-19
      • 2019-10-04
      • 2018-05-23
      • 2023-03-28
      • 2020-06-18
      • 2018-01-27
      • 2018-01-17
      • 2021-02-14
      • 1970-01-01
      相关资源
      最近更新 更多