簡體   English   中英

R 中 dataframe 中的行的條件修改

[英]Conditional modifying of rows in a dataframe in R

在我的Data中,我試圖在dv=="B"時將y更改為qlogis(y)

但我想知道為什么我會收到一條警告消息說NaNs produced

請注意, .5.6介於 0 和 1 之間,不應返回任何 NaN。

library(dplyr)

Data = read.table(text=
"
id dv y
1  A  2
1  B  .5
1  C  11
2  A  4
2  B  .6
2  C  19
", h=TRUE)

mutate(Data, y = ifelse(dv=="B", qlogis(y), y))

我們可以使用replace僅將qlogis應用於數據子集而不是完整數據

library(dplyr)
Data %>% 
   mutate(y = replace(y, dv == "B", qlogis(y[dv == "B"])))

-輸出

 id dv          y
1  1  A  2.0000000
2  1  B  0.0000000
3  1  C 11.0000000
4  2  A  4.0000000
5  2  B  0.4054651
6  2  C 19.0000000

IE

> qlogis(2)
[1] NaN
Warning message:
In qlogis(2) : NaNs produced
> qlogis(0.5)
[1] 0

該警告與ifelse如何處理 output 有關,即所有 arguments 應具有相同的長度。 因此, qlogis(y)被應用到整個列和 function 內部,它被處理以便只返回一個子集。 但是,警告已經來自qlogis function,這是由大於 1 的NaN引起的。

> qlogis(1)
[1] Inf
> qlogis(0.9)
[1] 2.197225
> qlogis(1.2)
[1] NaN
Warning message:
In qlogis(1.2) : NaNs produced
ifelse
function (test, yes, no) 
{
...

 ans <- test
    len <- length(ans)
    ypos <- which(test)
    npos <- which(!test)
    if (length(ypos) > 0L) 
        ans[ypos] <- rep(yes, length.out = len)[ypos]
    if (length(npos) > 0L) 
        ans[npos] <- rep(no, length.out = len)[npos]
    ans
...

現在,我們執行與 ifelse 代碼中相同的步驟

> test <- Data$dv == "B"
> ans <- test
>  len <- length(ans)
>     ypos <- which(test)
>     npos <- which(!test)
> ypos
[1] 2 5
> npos
[1] 1 3 4 6
> yes <- qlogis(Data$y)### it is the input on the whole column
Warning message:
In qlogis(Data$y) : NaNs produced

暫無
暫無

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

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