【问题标题】:Get ranges of dataframe given an input value (i.e. 1 returns df[1:10,])获取给定输入值的数据框范围(即 1 返回 df[1:10,])
【发布时间】:2019-04-04 09:11:04
【问题描述】:

我有一个数据帧 df,我想在 R 中创建一个函数,它返回给定输入数字的数据帧的 10 个条目的范围。那就是:

    If input number is equal to 1, the function returns df[1:10,]

    If input number is equal to 2, the function returns df[11:20,]

    If input number is equal to 3, the function returns df[21:30,]

    ...

就像页面一样:第 1 页显示十个条目,第 2 页显示接下来的十个条目,依此类推。

注意:

  1. 如果没有更多的“十个条目”要返回,该函数应该返回数据帧中剩下的所有内容

  2. 数据帧的长度不固定(即函数要求使用 df 并返回“页面”)。

它看起来很容易实现,但我不知道如何以正确和快速的方式实现它。

编辑

我的意思是返回行而不是列,抱歉。刚刚编辑。但是@Freakazoid 解决方案或多或少起到了作用,只需将 ncol 更改为 nrow (请参阅下面的解决方案)

【问题讨论】:

  • 如果您使用dput(data)提供数据样本会更有帮助
  • 如果数据框有 40 行并且要求显示第 7 页怎么办?在这种情况下,输出会是什么?
  • 正如您的语法所暗示的那样,您很可能想要选择行而不是列。但是,请考虑下限为1+(x-1)*10,上限为10*xx 是输入数字)。
  • 请对答案提供一些反馈。有什么帮助还是你有更多的问题?谢谢!
  • 感谢您的所有反馈。事实上,正如我在编辑过的问题中提到的那样,@Freakazoid 通过一些修改完美地完成了这个技巧,以使其适应行而不是列(我在最初的问题中的错误)。谢谢!

标签: r dataframe


【解决方案1】:

下面的函数可以解决问题:

df <- data.frame(matrix(rnorm(1020), nrow=54, ncol=3))

batch_df <- function(df, batch_part) {
  nbr_row <- nrow(df)
  batch_size <- 10
  nbr_of_batchs <- as.integer(nbr_row/batch_size)
  last_batch_size <- (nbr_row - nbr_of_batchs*batch_size) 

  batch_indizes <- c(rep(1:nbr_of_batchs, each=batch_size), 
                     rep(nbr_of_batchs+1, last_batch_size))

  if(all(batch_part %in% batch_indizes)) {
    row_index <- which(batch_indizes %in% c(batch_part))
    ret_df <- df[ row_index,]
  } else {
    ret_df <- data.frame()
  }
  return(ret_df)
}

batch_df(df, 3)

该函数首先定义行的索引。使用这些索引,该函数将搜索您要选择的 batch_part。 该函数不仅可以取单个数字;它可以是一个给定的向量,您可以在其中一次选择多个批处理部分。

输出:

       X1          X2         X3
21  0.7168950  0.88057886  0.1659177
22 -1.0560819 -0.53230247 -0.4204708
23  0.4835649 -1.43453719  0.1563253
24  0.1266011  1.22149179 -0.7924120
25  0.3982262 -0.59821992 -1.1645105
26 -0.4809448  0.42533877  0.2359328
27 -0.1530060 -0.23762552  0.9832919
28  0.8808083 -0.06004995 -1.0810818
29 -0.2924377 -1.23812802 -0.9057353
30 -0.2420152 -0.52037258  0.7406486

【讨论】:

  • 谢谢,您的解决方案可以解决问题!我的意思是行而不是列(我的错误,抱歉),但解决方案是相同的,只是通过 ncol 更改 nrow。而就在 'batch_indizes' 变量中,'each' 参数必须是 'each = batch_size'
【解决方案2】:

给定输入号i,试试

j <- i * 10
max <- pmin(j, nrow(df))
df[(j-9):max, ]

【讨论】:

  • 谢谢,您的解决方案也有效,尽管 Freakazoid 解决方案确实可以更好地处理数据帧的最后一个子集,以防它小于 10。并且还考虑了 df 的大小,因此它返回一个空的数据框,而不是一个充满 NA 的 df。当然,这是针对我需要满足这些要求的特殊情况,但可以肯定的是,在其他情况下,您的解决方案将完美运行!
  • 我很确定最后一页被正确处理并且不返回 NA 行。我弄错了吗?我会承认,当域中没有有效的行时,我的解决方案会失败,而其他答案处理得更好。
猜你喜欢
  • 2022-01-04
  • 2018-08-30
  • 2020-02-12
  • 1970-01-01
  • 2012-11-08
  • 2019-08-25
  • 1970-01-01
  • 2018-03-04
  • 1970-01-01
相关资源
最近更新 更多