让我们从一些数据开始:
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
亲爱的亲爱的我——我们必须小心,不是吗。