1. ホーム
  2. r

[解決済み] Rで比率を計算する

2022-02-10 21:09:06

質問

このデータセットがある場合 Name <- c("Bill", "Ben", "Lisa", "Maya") Xnum <- c(5, NA, 10, NA) Ynum <- c(10, 5, NA, NA) MyData <- data.frame(Name, Xnum, Ynum)

というデータセットを得ることができます。

 `print(MyData)
  Name Xnum Ynum
1 Bill    5   10
2  Ben   NA    5
3 Lisa   10   NA
4 Maya   NA   NA`

XをYで割ると、欲しい比率が得られる。これは簡単です。 MyData$Ratio <- MyData$Xnum / MyData$Ynum

が、問題はNAが含まれる値です。このような場合、次のような要件があります。

`If Xnum == NA AND Ynum == NA
    Ratio = 1
Else if Xnum == NA AND Ynum >= 0
    Ratio = 1
Else if Xnum >= 0 AND Ynum == NA
    Ratio = 0
Else
    Ratio = Xnum / Ynum`

XnumとYnumを渡して比率を返す関数として試してみましたが、私が期待するようなことはできません。この関数は

`determine_ratios <- function( PrevTotal, AllTotal ) {

    if ( (is.na(PrevTotal)) && (is.na(AllTotal)) ) {
        return(as.double(1.0))
    } else if ((PrevTotal  >= 0) && (is.na(AllTotal)) ) {
        return(as.double(1.0))
    } else if ((is.na(PrevTotal)) && (AllTotal >= 0) ) {
        return(as.double(0.0))
    } else {
        return(as.double(PrevTotal / AllTotal ))
    }
}`

そして、このように呼んでいます。

`MyData$Ratios <- determine_ratios(MyData$Xnum, MyData$Ynum)`

私が得た出力はこうです。

`print(MyData)
  Name Xnum Ynum Ratios
1 Bill    5   10    0.5
2  Ben   NA    5     NA
3 Lisa   10   NA     NA
4 Maya   NA   NA     NA`

期待される出力は次のようになる。

`print(MyData)
  Name Xnum Ynum Ratios
1 Bill    5   10    0.5
2  Ben   NA    5     1
3 Lisa   10   NA     0
4 Maya   NA   NA     1`

ありがとうございます。

解決方法は?

使用方法 case_when から dplyr パッケージを使用します。

library(dplyr)

MyData$Ratios <-
case_when(
    is.na(MyData$Xnum) & is.na(MyData$Ynum) ~ 1,
    is.na(MyData$Xnum) & MyData$Ynum >= 0 ~ 1,
    MyData$Xnum >= 0 & is.na(MyData$Ynum) ~ 0,
    TRUE ~ MyData$Xnum / MyData$Ynum
)