如何修复:colmeans(x, na.rm = true) 中的错误:“x”必须是数字


使用 R 时可能遇到的错误消息是:

 Error in colMeans(x, na.rm = TRUE): 'x' must be numeric

当您尝试使用prcomp()函数在 R 中执行主成分分析,并且您使用的数据框中的一列或多列不是数值时,通常会发生此错误。

有两种方法可以解决此错误:

方法 1:将非数字列转换为数字列

方法 2:从数据框中删除非数字列

以下示例展示了如何在实践中使用每种方法。

如何重现错误

假设我们尝试对以下包含一列字符的数据框执行主成分分析:

 #create data frame
df <- data. frame (team=c('A', 'A', 'C', 'B', 'C', 'B', 'B', 'C', 'A'),
                 points=c(12, 8, 26, 25, 38, 30, 24, 24, 15),
                 rebounds=c(10, 4, 5, 5, 4, 3, 8, 18, 22))

#view data frame
df

  team points rebounds
1 to 12 10
2 to 8 4
3 C 26 5
4 B 25 5
5 C 38 4
6 B 30 3
7 B 24 8
8 C 24 18
9 to 15 22

#attempt to calculate principal components
prcomp(df)

Error in colMeans(x, na.rm = TRUE): 'x' must be numeric

team列是字符列,在尝试使用prcomp()函数时会导致错误。

方法 1:将非数字列转换为数字列

避免此错误的一种方法是在使用prcomp()函数之前将team列转换为数字列:

 #convert character column to numeric
df$team <- as. numeric (as. factor (df$team))

#view updated data frame
df

  team points rebounds
1 1 12 10
2 1 8 4
3 3 26 5
4 2 25 5
5 3 38 4
6 2 30 3
7 2 24 8
8 3 24 18
9 1 15 22

#calculate main components
prcomp(df)

Standard deviations (1, .., p=3):
[1] 9.8252704 6.0990235 0.4880538

Rotation (nxk) = (3 x 3):
                 PC1 PC2 PC3
team -0.06810285 0.04199272 0.99679417
points -0.91850806 0.38741460 -0.07907512
rebounds 0.38949319 0.92094872 -0.01218661

这次我们没有收到任何错误,因为数据框中的每一列都是数字。

方法 2:从数据框中删除非数字列

避免错误的另一种方法是在使用prcomp()函数之前简单地从数据框中删除所有非数字列

 #remove non-numeric columns from data frame
df_new <- df[ , unlist(lapply(df, is. numeric ))]

#view new data frame
df_new

  rebound points
1 12 10
2 8 4
3 26 5
4 25 5
5 38 4
6 30 3
7 24 8
8 24 18
9 15 22

#calculate main components
prcomp(df_new)

Standard deviations (1, .., p=2):
[1] 9.802541 6.093638

Rotation (nxk) = (2 x 2):
                PC1 PC2
points 0.9199431 0.3920519
rebounds -0.3920519 0.9199431

同样,我们没有收到任何错误,因为数据框中的每一列都是数字。

注意:在大多数情况下,第一种方法是首选解决方案,因为它使用所有数据而不是删除某些列。

其他资源

以下教程解释了如何修复 R 中的其他常见错误:

如何在 R 中修复:参数涉及不同的行数
如何修复 R:选择未使用的参数时出错
如何在 R 中修复:替换长度为零

添加评论

您的电子邮箱地址不会被公开。 必填项已用*标注