【问题标题】:Slicing R Data Frame Based on Column Index [duplicate]基于列索引对R数据框进行切片[重复]
【发布时间】:2020-06-23 00:15:31
【问题描述】:

我有一个数据框

data <- data.frame(1:4,5:8,9:12,13:16)

我有一个列索引列表

col_index <- c(1,4,3,2)

对于每一行,我想选择列索引中指定的单元格,并返回以下值列表:1、8、11、14。

最好的方法是什么?

【问题讨论】:

  • @RonakShah,我认为你的行/列颠倒了
  • @r2evans 哦……我现在明白了。谢谢。我认为那么重复是不正确的?
  • 欺骗是适用的,但与此相反:欺骗想要给定列的每一行,而这个是给定行的每一列cbind(...) 的前提适用,我认为如果您将其作为评论重新发布,它仍然有用(尽管被骗了)。
  • data[cbind(col_index, seq_len(ncol(data)))]
  • @r2evans 谢谢,我同意这不是重复的。

标签: r


【解决方案1】:

你可以使用 slice.index:

> slice.index(data,1)
     [,1] [,2] [,3] [,4]
[1,]    1    1    1    1
[2,]    2    2    2    2
[3,]    3    3    3    3
[4,]    4    4    4    4

然后构造一个矩阵

> matrix(rep(col_index,4),4,4,byrow=TRUE)
     [,1] [,2] [,3] [,4]
[1,]    1    4    3    2
[2,]    1    4    3    2
[3,]    1    4    3    2
[4,]    1    4    3    2

创建一个蒙版

> slice.index(data,1) == matrix(rep(col_index,4),4,4,byrow=TRUE)
      [,1]  [,2]  [,3]  [,4]
[1,]  TRUE FALSE FALSE FALSE
[2,] FALSE FALSE FALSE  TRUE
[3,] FALSE FALSE  TRUE FALSE
[4,] FALSE  TRUE FALSE FALSE

最终

> data[slice.index(data,1) == matrix(rep(col_index,4),4,4,byrow=TRUE)]
[1]  1  8 11 14

【讨论】:

  • 在我所有的 R 生涯中,我从未使用过甚至听说过slice.index。有趣的功能。
猜你喜欢
  • 2018-12-03
  • 2018-03-12
  • 2018-11-21
  • 2020-12-26
  • 1970-01-01
  • 1970-01-01
  • 2021-01-19
  • 2019-11-14
相关资源
最近更新 更多