【问题标题】:randomize values within multiple columns of a data.frame随机化 data.frame 多列中的值
【发布时间】:2019-08-17 05:12:27
【问题描述】:

我正在尝试随机化多列中的值,但保持行和列的顺序。另外,我只想随机化每列中的值。我基本上想在数据框的多列(不仅仅是 V1 列)上使用下面的函数。

sample(myDF$V1)

编辑:这是一些带有 dput 的示例数据:

structure(list(V1 = c(9.883752193648, 15.8168998395206, 20.7796219245553, 
26.8050975188108), V2 = c(11.8173120437042, 14.1136424787568, 
21.4557850824769, 24.5183526363054), V3 = c(10.370627864258, 
14.6684224100574, 19.3556715707687, 25.6203798012984), V4 = c(10.520216457555, 
16.1207126516696, 18.4468625947703, 25.6121234926508), V5 = c(9.24946800549767, 
15.2987236992673, 18.4022904833037, 24.8376890230819)), .Names = c("V1", 
"V2", "V3", "V4", "V5"), class = "data.frame", row.names = c(NA, 
-4L))

这将是 V1 列的结果:

>myDF$V1
9.883752193648, 15.8168998395206, 20.7796219245553, 26.8050975188108

>sample(df1$V1)
26.805098  9.883752 15.816900 20.779622

【问题讨论】:

标签: r loops random shuffle sample


【解决方案1】:

你可能想要这个。使用lapplysample 应用于每一列。

set.seed(42)  # for sake of reproducibility
as.data.frame(lapply(myDF, sample))
#          V1       V2       V3       V4        V5
# 1 26.805098 21.45579 19.35567 25.61212 24.837689
# 2 20.779622 14.11364 25.62038 10.52022  9.249468
# 3  9.883752 24.51835 10.37063 18.44686 18.402290
# 4 15.816900 11.81731 14.66842 16.12071 15.298724

编辑

让我们给myDF 行名

rownames(myDF) <- letters[1:4]

我们可以缓冲它们

nm <- rownames(myDF)

并将它们与上面的命令一起归还。

set.seed(42)
myDF <- `rownames<-`(as.data.frame(lapply(myDF, sample)), nm)
myDF
#          V1       V2       V3       V4        V5
# a 26.805098 21.45579 19.35567 25.61212 24.837689
# b 20.779622 14.11364 25.62038 10.52022  9.249468
# c  9.883752 24.51835 10.37063 18.44686 18.402290
# d 15.816900 11.81731 14.66842 16.12071 15.298724

数据

myDF <- structure(list(V1 = c(9.883752193648, 15.8168998395206, 20.7796219245553, 
26.8050975188108), V2 = c(11.8173120437042, 14.1136424787568, 
21.4557850824769, 24.5183526363054), V3 = c(10.370627864258, 
14.6684224100574, 19.3556715707687, 25.6203798012984), V4 = c(10.520216457555, 
16.1207126516696, 18.4468625947703, 25.6121234926508), V5 = c(9.24946800549767, 
15.2987236992673, 18.4022904833037, 24.8376890230819)), class = "data.frame", row.names = c(NA, 
-4L))

【讨论】:

  • 谢谢。我认为这可行,但无法分辨,因为它不保留我的行名。抱歉,上面的示例中没有
  • 随机化由sample完成。 "rownames&lt;-" 只是分配您之前存储在 nm 中的行名。
  • 谢谢。我让它在样本上工作,但还不是我的数据。
  • 好的,检查并报告!
  • 好的,我现在明白了!它会向屏幕/控制台产生正确的(随机)输出,但不会保存它。这就是为什么当我通过打印 myDF 进行检查时,它看起来没有改变 - 因为它不会保存回 myDF。
猜你喜欢
  • 2012-02-17
  • 2011-09-05
  • 2021-10-28
  • 2020-02-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-25
相关资源
最近更新 更多