【问题标题】:Subsetting a table using a matrix使用矩阵对表进行子集化
【发布时间】:2014-07-01 11:17:43
【问题描述】:

我开始使用 R 并且遇到了一个 n 维表 my.table 的问题,我想以各种方式对其进行子集化。我有一个行矩阵m,它可以让我用my.table[m] 选择表格的一个单元格。现在我想使用m 来选择表格的一整行(不仅仅是一个单元格),方法是指示我不想被切片的一个维度i。通过将索引的i-th 位置留空,可以通过普通索引轻松完成此操作,但在我的情况下,i 的值仅在运行时才知道。

我会尝试用一些代码来说明它:

# let's assume n = 4
# I can pick a cell value with the literal indexing
a.value <- my.table[2, 1, 4, 2]
# And I can reproduce this with matrix indexing
m <- matrix(c(2, 1, 4, 2), nrow=1)
a.value <- my.table[m]

# Now let's assume i = 3
# I can subset the table with literal indexing to pick the whole row
a.row <- my.table[2, 1, , 2]
# But how can I do the same using the matrix m?

我试过设置m[i] &lt;- NA和m[i] &lt;- NULL,但显然不行。

是否有一些“神奇”的值相当于文字索引中的空白?还是没有办法直接做到这一点?

更新:

我将发布我现在正在使用的代码,它给出了我想要的结果。不过,很高兴知道是否有更好、更优雅或更通用的方法:

function(my.table, m, i) {
    i.dim <- dim(my.table)[i]
    return(apply(matrix(1:i.dim, nrow=1), 1, function(x) {
        # in my case, I don't need to preserve the original value of m[i]
        m[i] <- x
        return(my.table[m])
    }))
}

更新 2: 应@javlacalle 的要求,我发布了表格dput 的输出。

structure(c(0.830412306140461, 0.169587693859539, 0.944833625218914, 
0.0551663747810858, 0.993589743589744, 0.00641025641025641, 1, 
0, 0.992307692307692, 0.00769230769230769, 1, 0, 1, 0, NaN, NaN
), class = "table", .Dim = c(2L, 2L, 2L, 2L), .Dimnames = structure(list(
    V29.0 = c("0", "1"), `779.89` = c("0", "1"), `771.81` = c("0", 
    "1"), `771.89` = c("0", "1")), .Names = c("V29.0", "779.89", 
"771.81", "771.89")))

更新 3:

我发现我所说的“神奇”值确实存在,您可以通过 bquote() 获得它 - 只是我认为没有办法将它与其他数字一起使用矩阵以形成适当的索引。

【问题讨论】:

  • 你试过m[i,] &lt;- NA吗?这会将第 i 行中的所有元素设置为 NA。这就是你想要的吗?
  • @javlacalle 不,实际上m 只是一行。我希望能够在my.table 中选择一行,我为除i 之外的表格的每个维度提供具体值。我将编辑问题以更好地解释它。
  • 请发布dput(my.table) 的输出以及您要选择的值。
  • 如果我使用f(my.table, m, 2),则会收到错误消息,因为在使用apply 时未定义参数MARGIN。如何使用这个函数得到结果?
  • 您可以将您想要的表达式定义为字符,然后对其进行评估。例如,eval(parse(text="my.table[2,1,,2]"))。这样你只需要担心定义一个字符串。

标签: r subset


【解决方案1】:

写作怎么样? my.table[1, 1, 1, 1:2] 而不是 my.table[1, 1, 1, ]? 您可以将要扩展的索引设置为 0(在 m 中),然后定义

f <- function(my.table, m) {
    dims <- dim(my.table)
    a <- lapply(1:4, function(x) if (m[, x] == 0) 1:dims[x] else m[, x])
    my.table[a[[1]], a[[2]], a[[3]], a[[4]]]
}

例如

m <- matrix(c(0, 1, 1, 0), nrow = 1)
my.table[, 1, 1, ] # same as my.table[1:2, 1, 1, 1:2]
#      771.89
# V29.0         0           1
#     0 0.8304123 0.992307692
#     1 0.1695877 0.007692308

f(my.table, m)
#      771.89
# V29.0         0           1
#     0 0.8304123 0.992307692
#     1 0.1695877 0.007692308

【讨论】:

  • 我想知道该语言是否提供了一些结构来直接执行此操作而无需任何辅助函数,但我认为它没有。不过,您的解决方案非常好,所以我会接受它作为正确答案。
猜你喜欢
  • 2018-08-07
  • 2014-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-05
  • 1970-01-01
相关资源
最近更新 更多