我有一个数据框,其中包含一列名称和更多列,其中包含按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(是)。
感谢您的帮助。
答案 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)