[英]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.