使用二进制文件使数据框总和为1

时间:2016-05-18 17:20:03

标签: r dplyr

我有一个只有零和一的数据框,例如

df <- data.frame(v1 = rbinom(100, 1, 0.5), 
                 v2 = rbinom(100, 1, 0.2),
                 v3 = rbinom(100, 1, 0.4))

现在我想修改这个数据集,以便每行总和为1。

所以这个

1 0 0
1 1 0
0 0 1
1 1 1
0 0 0

应该成为这个:

1    0    0
0.5  0.5  0
0    0    1
0.33 0.33 0.33
0    0    0

编辑:全部为零的行应保持原样

2 个答案:

答案 0 :(得分:5)

正如@lmo已经指出的那样,data.frame(或矩阵)可以用

修改
df <- df / rowSums(df)

如果行只包含零,则会导致只包含NaN的行。由于这些行应保持原样,因此最简单的方法可能是使用

进行纠正
df[is.na(df)] <- 0

答案 1 :(得分:3)

这是一种快速方法:

# create matrix
temp <- matrix(c(1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1), ncol=3, byrow=T)

temp / rowSums(temp)

这利用了矩阵按列排序的事实,因此rowsSums的元素划分和循环的元素是对齐的。

如果一行中的所有元素都为零,并且您不想要Inf,则@RHertel的另一个方法如下:

# save rowSum:
mySums <- rowSums(temp)
temp / ifelse(mySums != 0,  mySums, 1)