【问题标题】:Slice/subset in R using vector/matrix/list as indicesR中的切片/子集使用向量/矩阵/列表作为索引
【发布时间】:2020-03-02 14:35:51
【问题描述】:

我们可以得到第 2 行第 4 列的元素为

iris[2,4]

如果我有切片元素的向量/矩阵,如何做同样的事情。即我可以得到以下任何一个来提供与 iris[2,4] 相同的输出吗? (或类似的东西,不创建任何临时变量)

a = c(2,4)
b = matrix(c(2,4), nrow=1)
c = list(2,4)
iris[a]
iris[b]
iris[c]

【问题讨论】:

  • iris[b] 有效吗?
  • @RonakShah 确实如此,但输出是一个“字符”向量。它将数字/因子强制转换为字符。不想那样。
  • 取向量的各个元素怎么样?喜欢你的矢量a 示例:iris[a[1],a[2]]
  • @drmariod 实际上我想通过直接使用 arrayInd(which.min(mtrx), dim(mtrx) 的输出来切片 matrix ,并且想要一种切片 df、矩阵等的通用方法。简而言之,a 变量是只是一个例子,我想直接使用c(2,4)。接受的答案效果很好。

标签: r subset slice


【解决方案1】:

该值被强制转换为字符,因为您使用 matrix 方法进行子集化,并且其中一列是类字符。

我们可以通过两种方式规避这一点。要么我们事先删除字符列,

v <- c(2, 4)
m <- matrix(c(2, 4), nrow=1)
l <- list(2, 4)

iris[,-5][t(v)]
# [1] 0.2
iris[,-5][m]
# [1] 0.2
iris[,-5][do.call(cbind, l)]
# [1] 0.2

或者我们使用list 方法进行子集化。 (irisdata.frame,所以两者都适用)

iris[[rev(v)]]
# [1] 0.2
iris[[rev(c(m))]]
# [1] 0.2
iris[[rev(unlist(l))]]
# [1] 0.2

【讨论】:

  • 列表子集方法确实是直接接受向量进行切片。谢谢,这解决了我的问题。但是rev 函数不是必需的。 rev 对向量进行排序,因此不会给出正确的结果。直接输入向量就可以了。
  • 是不是因为data.frame可以看作是一个列的列表,所以它需要rev()[[ ]]中?只是想了解背后的事实......
  • @ThomasIsCoding:是的。将向量传递给[[]] 会遍历一个嵌套列表。 data.frame 中的列算作顶层。 `
猜你喜欢
  • 1970-01-01
  • 2013-03-18
  • 2022-11-02
  • 1970-01-01
  • 2011-08-19
  • 1970-01-01
  • 1970-01-01
  • 2015-06-14
相关资源
最近更新 更多