将数据帧编号平均分组

时间:2015-03-27 15:29:23

标签: r

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

     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

我现在想要将平均分配到给定数量的组中,按列逐个显示所有1,并在附加列中添加相关组的编号。如果我们将Running和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

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

ceiling(sum(column)/100*groups)

我确信R有一个简单的方法,但我找不到忽略0( nos )的解决方案,只将组号添加到1s()。

感谢您的帮助。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

使用下面显示的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)