【问题标题】:Divide data frame number equally in groups将数据帧号平均分组
【发布时间】:2015-03-28 01:42:10
【问题描述】:

我有一个数据框,其中有一列名称和更多列,其中包含由 0 和 1 编码的属性(等于 noyes)。

     Name     Running   Cycling
1     Adam     1         0
2     Steve    0         1
3     Aaron    1         1
4     Nick     1         0
5     Paul     1         0
6     Stuart   1         0

我现在想将 yes 平均分成给定数量的组,按列表示所有 1,并在附加列中添加相关组的数量。如果我们将跑步和骑自行车分成两组,结果应该是这样的:

Name     Running   Cycling  Running-Group Cycling-Group
1     Adam     1         0        1           0 
2     Steve    0         1        0           1
3     Aaron    1         1        1           2
4     Nick     1         0        1           0
5     Paul     1         0        2           0
6     Stuart   1         0        2           0

我可以通过以下方式获取组号:

ceiling(sum(column)/100*groups)

我确信使用 R 有一个简单的方法,但是我找不到忽略 0(nos)并将组号仅添加到 1(yes )。

感谢您的帮助。

【问题讨论】:

  • 在预期结果中,我认为Running 列有错字。所有元素都是1。此外,不清楚您是如何得到预期结果的。 ceiling 公式中的 groups 是什么?
  • 完全不清楚。例如,如何获得第 2 行和第 3 行的两个额外列?
  • 我认为这两个表之间的描述会很清楚...... 1应该被解释为yes,我想将所有“是”划分为定义数量的组。因此,如果有 8 个 1s 并且我想创建 4 个组,则具有 1 的前两个名称将在第 1 组中,接下来的两个在第 2 组中,依此类推.
  • @Laura 如果您将 1 等分,那么 Running 的第一个数据集中的 0 将是一个错字。否则,1s 的数量将是奇数,即 5,并且不清楚如何在奇数之间划分组。
  • 我只能说对不起:这确实是一个错字,所以没有任何意义。我编辑了它,希望现在有意义。

标签: r


【解决方案1】:

这可能有帮助

nm1 <- paste(names(df1)[-1], 'Group', sep="_")
df1[nm1] <- lapply(df1[-1], function(x) {
                  x1 <- x==1
                  x[x1] <- gl(sum(x1),ceiling(sum(x1)/2), sum(x1))
                   x})
 df1
 #    Name Running Cycling Running_Group Cycling_Group
 #1   Adam       1       0             1             0
 #2  Steve       0       1             0             1
 #3  Aaron       1       1             1             2
 #4   Nick       1       0             1             0
 #5   Paul       1       0             2             0
 #6 Stuart       1       0             2             0

【讨论】:

    【解决方案2】:

    使用如下所示的grps函数:

    grp <- function(x) { 
      s <- seq_along(x)
      x * ((s > mean(s)) + 1)
    }
    
    grps <- function(x) ave(x, x, FUN = grp)
    
    transform(DF, 
      Running_Group = grps(Running),
      Cycling_Group = grps(Cycling))
    

    给予:

        Name Running Cycling Running_Group Cycling_Group
    1   Adam       1       0             1             0
    2  Steve       0       1             0             1
    3  Aaron       1       1             1             2
    4   Nick       1       0             1             0
    5   Paul       1       0             2             0
    6 Stuart       1       0             2             0
    

    注意:我们将以下内容用作DF

    Lines <- "     Name     Running   Cycling
    1     Adam     1         0
    2     Steve    0         1
    3     Aaron    1         1
    4     Nick     1         0
    5     Paul     1         0
    6     Stuart   1         0"
    
    DF <- read.table(text = Lines, header = TRUE)
    

    【讨论】:

      猜你喜欢
      • 2021-02-02
      • 2023-02-21
      • 1970-01-01
      • 1970-01-01
      • 2019-01-07
      • 2021-11-02
      • 1970-01-01
      • 2021-11-11
      • 1970-01-01
      相关资源
      最近更新 更多