【问题标题】:shuffle and swap column R洗牌和交换列R
【发布时间】:2018-06-02 21:09:37
【问题描述】:

我有 2000 行网球比赛的 df 和 10 列单场比赛的静态数据。所有比赛都按比赛的DAY排序,在ID1中是比赛的获胜者。

我需要的是洗牌我的 df 行(这不是问题,因为它非常简单)并随机更改 ID1->ID2 的位置和所有列中的统计信息,例如列 A_1 -> 列A_2,当发生这种情况时添加一列,例如当列的位置改变时添加“1”,当所有列都在相同位置时添加“0”。

这里是一个例子

DAY    ID1      ID2      A_1    A_2    B_1    B_2
1       10       20       4      6      10     2
2       5         4       0      2       5     1
3       23        34      5      10      2     8
4        4        12      6       4      3     1

EXPECTED RESULT
DAY    ID1      ID2      A_1    A_2    B_1    B_2    X
2       5         4       0      2       5     1     0
1       20        10      6      4       2     10    1
3        4        12      6       4      3     1     0
4       23        34      5      10      2     8     0

我的第一次尝试是做一个样本,然后从主 df 中减去样本中的行。然后更改 2 个表之一中的每个名称列。

【问题讨论】:

  • 当你写randomly change position of ID1->ID2 and the stats in all the columns时,你的意思是你想以某种概率决定p是否随机打乱每行的列值(就像掷硬币一样,其中一些行保持未打乱,有些被打乱),还是你的意思是你肯定想随机打乱每一行的列值(然后只跟踪哪些行碰巧有打乱使排序保持不变)?

标签: r database split shuffle


【解决方案1】:

这应该可以工作,在基础R:

set.seed(16)
df1 <- apply(df[sample(nrow(df)),],1,function(x) {
  s <- sample(2)
  y <- c(x[1],x[s+1],x[s+3],x[s+5])
  y["X"] <- !all(s == 1:2)
  y})

df1 <- setNames(as.data.frame(t(df1)),c(names(df),"X"))
df1
#   DAY ID1 ID2 A_1 A_2 B_1 B_2 X
# 3   3  34  23  10   5   8   2 1
# 1   1  10  20   4   6  10   2 0
# 4   4  12   4   4   6   1   3 1
# 2   2   5   4   0   2   5   1 0

sample(2) 洗牌矢量1:2。每次迭代都会产生一个新的采样实例。

它可以等于c(1,2)c(2,1)

因此:

  • x[s+1]c(x[2],x[3])c(x[3],x[2])
  • x[s+3]c(x[4],x[5])c(x[5],x[4])
  • x[s+5]c(x[6],x[7])c(x[7],x[6])

它们都一起切换或根本不切换,因为它们都使用相同的 s

【讨论】:

  • 不是我预期的结果。如果 id1 变为 id2 反之亦然,列必须以这种方式反转:A1->A2 反之亦然 B1->B2 反之亦然。 A 中的值在 B 列中不变。
  • 史诗!你能帮我理解这部分吗? y
  • 我加了解释
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多