【问题标题】:create column representing the dataframe cut into 20 even groups in R创建表示数据框的列,在 R 中切成 20 个偶数组
【发布时间】:2021-01-16 04:31:07
【问题描述】:

我正在使用 R 尝试在我的数据框中创建一个名为 df 的列,它将数据分成 20 个偶数组,新列 group 的每一行都有相应的组。我的有序数据示例如下所示:

                preds ground_truth
65378  0.000002975379            0
27082  0.000004721652            0
26890  0.000006613435            1
130498 0.000007634303            0
173319 0.000007834359            0
20039  0.000009482496            0
64722  0.000009482496            0
53924  0.000009482496            0
165543 0.000009482496            0

我之前问过一个类似的问题,也有类似的答案,但是由于某种原因,这些解决方案不起作用。其他答案在这里:

Splitting a continuous variable into equal sized groups R divide data into groups

我的解决方案是这样使用 cut:

  df$group <- cut(index(df), 20, labels = FALSE)

我希望这会将数据帧索引分成 20 个偶数组,因此在 129844 行中,每组将有 6492 个。但是,这只会产生一个单一的组,根本不会拆分数据。有人可以解释为什么 cut here 不起作用,其他数据帧在哪里?

任何我愿意提供的额外信息,

编辑: 我需要数据分组相对于 preds 是有序的,例如第一组将包含最高的 6492 值,第二组是次高的 6492,依此类推。

数据分组必须按照最高组的顺序排列 这是前 10 行的数据:

structure(list(preds = c(0.00000297537922317814, 
0.00000472165221855588, 
0.0000066134351160987, 0.00000763430272198875, 0.00000783435945631941, 
0.00000948249581302744, 0.00000948249581314139, 0.00000948249581314247, 
0.00000948249581314704, 0.0000094824958131879), ground_truth = 
structure(c(1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = c("0", "1"), class = 
"factor")), .Names = c("preds", 
"ground_truth"), row.names = c("65378", "27082", "26890", "130498", 
"173319", "20039", "64722", "53924", "165543", "168952"), class = 
"data.frame")

【问题讨论】:

  • index函数从何而来?
  • @jdobres 来自包装动物园
  • cut(as.numeric(rownames(df)), 20, labels=F) 适合你吗?
  • 如果您可以分享一个可重现的示例(示例数据、代码和输出),这也会很有帮助。正如目前所写的那样,您的代码应该按预期工作,因此必须关闭其他内容。
  • @geds133 cut(as.numeric(rownames(dat)), 20, labels=F) 适合我。

标签: r dataframe


【解决方案1】:

使用一些模块化数学怎么样?

如果我们有一个包含 129844 行的数据框:

df <- data.frame(a = runif(129844))

我们可以将每一行分配给标记为 1 到 20 的 20 个大小均匀的组之一,如下所示:

df$group <- factor(1 + (seq(nrow(df)) - 1) %/% (nrow(df) / 20))

为了证明这一点:

table(df$group)

#>    1    2    3    4    5    6    7    8    9   10   11   12   13   14   15   16   17   18   19   20 
#> 6493 6492 6492 6492 6492 6493 6492 6492 6492 6492 6493 6492 6492 6492 6492 6493 6492 6492 6492 6492

显然 129844 不能被 20 整除,因此我们有 4 个包含 6493 个成员的组。

【讨论】:

  • 谢谢!这会考虑排序还是改组?
  • 另外,当我尝试运行此程序时,我收到此错误:'replacement has 0 rows, data has 129844'
  • @geds133 为什么? nrow(df) 有什么用?如果您的数据框实际上被称为 df 并且有 129844 行,那么这应该可以工作。试试我的例子。
【解决方案2】:

对于大小相等且有序的组,我们可以使用dplyr 包中的ntile

df <- df %>%
  arrange(preds) %>%
  mutate(group = ntile(preds, 20))

              preds ground_truth group
65378  2.975379e-06            0     1
27082  4.721652e-06            0     2
26890  6.613435e-06            0     3
130498 7.634303e-06            0     4
173319 7.834359e-06            0     5
20039  9.482496e-06            0     6
64722  9.482496e-06            0     7
53924  9.482496e-06            0     8
165543 9.482496e-06            0     9
168952 9.482496e-06            0    10

由于您的样本仅包含 10 行,因此只有 10 个组。它应该适用于您的整个数据框。 或查看ggplot2 包中的cut_number

df$group2 <- cut_number(df$preds, 20, labels = c(1:20))

【讨论】:

    猜你喜欢
    • 2015-04-21
    • 2023-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-17
    • 1970-01-01
    相关资源
    最近更新 更多