簡體   English   中英

如果rowSums大於1,則除以sum

[英]If rowSums greater than one, divide by sum

如果rowSums()大於1,我想除以行的總和。 沒有for()循環,我沒有想過這樣做的方法,所以我正在尋找一個沒有循環的解決方案。

樣本數據

dat <- structure(list(x1 = c(0.18, 0, 0.11, 0.24, 0.33), x2 = c(0.34, 
0.14, 0.36, 0.35, 0.21), x3 = c(0.1, 0.36, 0.12, 0.07, 0.18), 
    x4 = c(0.08, 0.35, 0.06, 0.1, 0.09), x5 = c(0.26, 0.13, 0.22, 
    0.31, 0.22)), .Names = c("x1", "x2", "x3", "x4", "x5"), row.names = c(NA, 
5L), class = "data.frame")

> rowSums(dat)

   1    2    3    4    5 
0.96 0.98 0.87 1.07 1.03 

我試過的

這有效,但我想知道是否有更好的方法:

a <- which(rowSums(dat) > 1)
dat[a, ] <- dat[a,] / rowSums(dat[a,]

> rowSums(dat)
   1    2    3    4    5 
0.96 0.98 0.87 1.00 1.00 

這給出了與問題末尾附近的表達式相同的值:

dat / pmax(rowSums(dat), 1)

這不如G.格洛騰迪克的回答,但你也可以使用ifelse

rs <- rowSums(dat)
dat / ifelse(rs < 1, rs, 1L)
         x1        x2        x3         x4        x5
1 0.1875000 0.3541667 0.1041667 0.08333333 0.2708333
2 0.0000000 0.1428571 0.3673469 0.35714286 0.1326531
3 0.1264368 0.4137931 0.1379310 0.06896552 0.2528736
4 0.2400000 0.3500000 0.0700000 0.10000000 0.3100000
5 0.3300000 0.2100000 0.1800000 0.09000000 0.2200000

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM