2

让我们从一些数据开始:

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

SV_mL现在让我们从两个感兴趣的变量和中创建一个因子CO_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,ofCO_L为 1(基于默认的字母顺序)。碰巧我的数据框的第一列是一个因素——所以我得到了一个错误。第二列恰好是SV_mL,所以我(引用 unquote)“幸运地”得到了正确的答案。

假设这是以不同的方式设置的。

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

亲爱的亲爱的我——我们必须小心,不是吗。

4

1 回答 1

1

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

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

因此, SV_mL 被视为 '2' 并按照您的预期给出第二列,但 CO_L 被视为 '1' 并返回第一列,即 column Group。因子向量的平均值为您提供您看到的警告并返回 NA。

mean(data$Group)
[1] NA
Warning message:
In mean.default(data$Group) :
  argument is not numeric or logical: returning NA
于 2014-09-23T15:17:35.583 回答