【问题标题】:Randomizing rows in a dataset using R [duplicate]使用 R 随机化数据集中的行
【发布时间】:2021-02-19 18:32:01
【问题描述】:

我对此进行了广泛的搜索,并且我能够找到随机化行顺序的所有示例,但没有找到行本身的数据。我正在尝试创建一个数据需要随机化的数据集。

我正在尝试将 df 变成 df2;

df:

df <- data.frame(a = c(1:5),
                 b = c(LETTERS[1:5]),
                 c = c(letters[1:5]))

  a b c
1 1 A a
2 2 B b
3 3 C c
4 4 D d
5 5 E e

df2


  a b c
1 2 D b
2 1 B d
3 4 E c
4 3 A a
5 5 C e

我认为没有很多解决方案的原因是人们需要保持他们的数据完整,但在这种情况下,我试图阻止数据集本身,因此条目不再正确。

目前我能做到的只有


df2 <- df[sample(1:nrow(df)), ]

  a b c
3 3 C c
4 4 D d
2 2 B b
1 1 A a
5 5 E e

随机化行的顺序但保持数据完整。

【问题讨论】:

  • df2 &lt;- df; df2[] &lt;- lapply(df2, sample)
  • 谢谢!有用!试图找到一种方法将其标记为正确答案。你能解释一下df吗? df2[] 简要介绍?
  • df2 &lt;- df 将数据帧复制到一个新对象,这样原始对象就不会被覆盖;如果您不在乎,请跳过它。因为数据框是一个列列表,所以lapply(df2, sample) 在每一列上调用sample() 并在列表中返回结果。 df2[] &lt;- 将该列表分配回df2,但由于[],它分配给对象的一个​​子集(恰好是这里的全部),因此它保留其数据框类而不是覆盖它使用像df2 &lt;- 这样的新对象。
  • 非常感谢!不知道如何像换行一样使用分号。改进它的使用;如果我只想随机化某些列,我应该尝试什么?我尝试在 lapply 内的 df2 上进行子集化,但没有按预期工作。
  • 它是列表子集,所以像列表一样对数据框进行子集,为列使用一组索引,例如iris[1:4] &lt;- lapply(iris[1:4], sample)。不过,请确保您分配给您正在迭代的相同列,否则事情会变得很奇怪。

标签: r dplyr


【解决方案1】:

您可以将sample 应用于数据框的每一列。

library(dplyr)
df2 <- df %>% mutate(across(.fns = sample))
#In older version of `dplyr` use `mutate_all`
#df2 <- df %>% mutate_all(sample)

#  a b c
#1 5 C c
#2 3 B e
#3 2 E d
#4 4 D b
#5 1 A a

【讨论】:

  • 这里的 .fns 是关于什么的?
  • 就是指定我们要对每一列应用的函数。
  • 谢谢,对于我的用例,这也适用。但是当我尝试在 mtcars 数据集上使用它时,它会展平在这种情况下是汽车名称的行名。知道为什么以及如何避免吗?另外,我如何才能找到有关 .fns 使用情况的更多信息?
  • Tibbles 不支持行名,因此如果您想存储行名信息,您需要将它们添加为单独的列并执行mtcars %&gt;% rownames_to_column() %&gt;% mutate(across(.fns = sample))。有关.fns 的更多信息,请参阅?across
猜你喜欢
  • 2018-03-25
  • 2018-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-02
  • 2019-07-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多