【发布时间】:2017-01-13 22:59:02
【问题描述】:
考虑以下模拟sn-p:
k <- 1:5
x <- seq(0,10,length.out = 100)
dsts <- lapply(1:length(k), function(i) cbind(x=x, distri=dchisq(x,k[i]),i) )
dsts <- do.call(rbind,dsts)
为什么这段代码会报错(dsts是矩阵):
subset(dsts,i==1)
#Error in subset.matrix(dsts, i == 1) : object 'i' not found
即使是这个:
colnames(dsts)[3] <- 'iii'
subset(dsts,iii==1)
但不是这个(矩阵强制为数据框):
subset(as.data.frame(dsts),i==1)
这个可以在 x 已经定义的地方工作:
subset(dsts,x> 500)
错误发生在subset.matrix()这一行:
else if (!is.logical(subset))
这是一个应该报告给 R Core 的错误吗?
【问题讨论】:
-
列名评估仅适用于 data.frames,不适用于矩阵。这就是子集的设计方式。它在文档中有所描述。这不是错误。
-
您会很高兴听到不建议将此功能用于非交互式使用:
This is a convenience function intended for use interactively. For programming it is better to use the standard subsetting functions like [, and in particular the non-standard evaluation of argument subset can have unanticipated consequences.。 -
@aichao 不清楚您的示例应该如何工作。 OP 已经有一个包含定义变量的列,应该用于子集。
-
这里的要点是,除非您需要矩阵运算,否则最好将数据存储在 data.frame 中。这就是R路。您可以使用
cbind.data.frame更明确。 -
@MrFlick 我认为您应该将您的 cmets 表达为一个完整的答案。
标签: r debugging matrix dataframe subset