让我们从一些数据开始:
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,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
亲爱的我亲爱的 - 我们一定要小心,不能是我们。
答案 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