我有一个只有零和一的数据框,例如
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
编辑:全部为零的行应保持原样
答案 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)