gpt4 book ai didi

r - 使用 `subset` 函数按列名进行矩阵子集化

转载 作者:行者123 更新时间:2023-12-04 12:25:38 29 4
gpt4 key购买 nike

考虑以下模拟片段:

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 的错误吗?

最佳答案

您所描述的行为是设计使然,并记录在 ?subset 帮助页面上。

来自帮助页面:

For data frames, the subset argument works on the rows. Note that subset will be evaluated in the data frame, so columns can be referred to (by name) as variables in the expression (see the examples).

在 R 中,data.frames 和矩阵是非常不同类型的对象。如果这是导致问题的原因,您可能为数据使用了错误的数据结构。只有当你需要矩阵运算时,矩阵才是真正必要的。如果您将列视为行观察的不同属性,那么您应该首先将数据存储在 data.frame 中。您可以将所有值存储在一个简单的向量中,其中每三个值代表一个观察值,但这对于您的数据来说也是一种糟糕的数据结构选择。我不确定您是否想通过选择矩阵来提高效率,但这似乎是错误的选择。

data.frame 存储为命名列表,而矩阵存储为维度向量。一个列表可以用作一个环境,它使得在该上下文中评估变量名称变得容易。两者之间最大的区别是 data.frames 可以保存不同类(数字、字符、日期)的列,而矩阵只能保存一种 data.type 的值。您不能总是在不丢失信息的情况下轻松地在两者之间进行转换。

$ 这样的想法也只适用于 data.frames。

dd <- data.frame(x=1:10)
dd$x
mm <- matrix(1:10, ncol=1, dimnames=list(NULL, "x"))
mm$x # Error

如果你想对矩阵进行子集化,你最好使用标准的 [ 子集而不是 sub 设置函数。

dsts[ dsts[,"i"]==1, ]

很长一段时间以来,这种行为一直是 R 的一部分。对此行为的任何更改都可能会对依赖于在特定上下文中评估的变量的现有代码引入重大更改。我认为问题在于首先告诉您使用矩阵的人。您应该使用 data.frame()

而不是 cbind()

关于r - 使用 `subset` 函数按列名进行矩阵子集化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39349791/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com