在特定条件下随机增加一行(二进制)的值

时间:2018-11-01 09:46:18

标签: r dplyr

我有一个这样的数据集:

A   B C D E F G
12  1 0 0 0 0 0
Hey 0 1 0 0 0 0
No  0 0 0 0 0 1 
Yes 0 0 0 0 1 0 

我想构建一个场景,如果COLUMN的YES多10%(是= 1),将会发生什么。但是,在我的场景中,应该同时使用3列。

因此:假设感兴趣的行是B = 1或C = 1或D = 1。如果其中一列等于1,就可以了。但是我想(随机地)将剩余的10%的行(其中B = 0&C = 0&D = 0)变成1(当然,如果我们给它们(剩余的10%的随机行)为1,则其他列应全部为0(A列除外)。

对不起,确实很难解释这个问题。希望很清楚。

结果应该是这样的(由于示例太小,它不代表10%)。

A   B C D E F G
12  1 0 0 0 0 0
Hey 0 1 0 0 0 0
No  0 0 0 0 0 1 
Yes 0 1 0 0 0 0

其中您可以看到“是”被随机分配为C = 1,并且其原始值重新设置为0。

1 个答案:

答案 0 :(得分:1)

我相信这就是您想要的:

数据:

df1<-
structure(list(A = c("12", "Hey", "No", "Yes"), B = c(1L, 0L, 
0L, 0L), C = c(0L, 1L, 0L, 0L), D = c(0L, 0L, 0L, 0L), E = c(0L, 
0L, 0L, 0L), F = c(0L, 0L, 0L, 1L), G = c(0L, 0L, 1L, 0L)), row.names = c(NA, 
-4L), class = "data.frame")

代码:

m <- `rownames<-`(df1[,-1],df1[,1])  # make your life simple, add character col as rownames

percentage = .5   # choose any percentage you like from 0 to 1, .1 for 10%
amountOf1  = floor(percentage * ncol(m)) # get the amount of ones based on percentage

IND <- which(rowSums(m[,1:3]) == 0)  # get those rows having B, C, D with 0

for(i in IND) {
    m[i,] = sample(rep(1:0,c(amountOf1,ncol(m)-amountOf1)) )
}

结果:(现在50%是B,C,D为0的行中的1)

#    B C D E F G
#12  1 0 0 0 0 0
#Hey 0 1 0 0 0 0
#No  1 0 0 0 1 1
#Yes 1 0 1 0 0 1