R:使用因子对数据帧进行子集化时出现警告,但不对字符进行子集化

时间:2014-09-23 15:08:27

标签: r subset factors

让我们从一些数据开始:

set.seed(0)
data <- data.frame('Group' = rep(c('Control', 'Disease'), 10),
                   'SV_mL' = rnorm(20),
                   'CO_L' = rnorm(20))

现在让我们从感兴趣的两个变量SV_mLCO_L中创建一个因子。

var <- as.factor(colnames(data)[colnames(data) != 'Group'])

基于SV_mL的子集无论我是否首先将其转换为字符都有效:

mean(data[data$Group == 'Control',var[1]]) # 0.2077689
mean(data[data$Group == 'Control',as.character(var[1])]) # 0.2077689

但基于CO_L的子集仅在我首先将其转换为字符时才有效:

mean(data[data$Group == 'Control',var[2]]) # NA
mean(data[data$Group == 'Control',as.character(var[2])]) # 0.194133

在返回NA的行中,我收到以下警告:

Warning message: argument is not numeric or logical: returning NA

我理解通过在将因子用于子集数据帧之前将因子转换为字符,我可以避免这个问题。但是,我想了解为什么会发生这种情况,特别是为什么它出现在一个因素而不是另一个因素。

向遇到此帖的人发出警告。

由于下面的答案,我现在知道当您尝试基于因子对数据帧进行子集时,它会使用该因子的数字表示。在这种情况下,SV_mL的数字表示为2,CO_L的数字表示为1(基于默认的字母顺序)。碰巧我的数据帧的第一列是一个因素 - 所以我得到了一个错误。第二列碰巧是SV_mL,所以我(引用不引用)“幸运地”得到了正确答案。

让我们说这个设置不同。

set.seed(0)
data <- data.frame('Group' = rep(c('Control', 'Disease'), 10),
                   'X' = rnorm(20),
                   'SV_mL' = rnorm(20),
                   'CO_L' = rnorm(20))

var <- as.factor(colnames(data)[colnames(data) != 'Group'])

在这种情况下,X是第一个因素,但其数字表示为3。因此,基于因子表示的子集化,我会得到错误列的平均

mean(data[data$Group == 'Control',var[1]]) # 0.194133
mean(data[data$Group == 'Control','X']) # 0.2077689

亲爱的我亲爱的 - 我们一定要小心,不能是我们。

1 个答案:

答案 0 :(得分:1)

原因是当您不将因子转换为字符时,它们在子集中被视为数字。

var
[1] SV_mL CO_L
as.numeric(var)
[1] 2 1

因此,SV_mL被认为是&#39; 2&#39;并按照您的意愿给出第二列,但CO_L被认为是&#39; 1&#39;并返回第一列,即列Group。因子向量的平均值为您提供警告并返回NA。

mean(data$Group)
[1] NA
Warning message:
In mean.default(data$Group) :
  argument is not numeric or logical: returning NA