我正在嘗試為資料框創建一個驗證階段。我正在嘗試使用 validate 庫并添加了此處檔案中描述的元素。
但是,僅當該列存在時,我才能看到檢查該列屬性的正確方法。
按照教程中的汽車示例:
library(validate)
data(cars)
rules <- validator(speed >= 0, dist >= 0)
confront(cars, rules)
所以效果很好。我想做的是添加一個規則,這樣如果汽車資料中有一個名稱列,它將是字符型別。但是,如下添加規則時,會引發錯誤,因為名稱列不存在,無法運行該規則。
library(validate)
data(cars)
rules <- validator(speed >= 0, dist >= 0, is.character(name))
confront(cars, rules)
**更新我不知道以下嘗試是否更好地代表了我的目標。這在語法上失敗。
rules <- validator(speed >= 0, dist >= 0, speed/dist <= 1.5, cor(speed, dist)>=0.2, ifelse(exists("name"), is.character(name),T))
uj5u.com熱心網友回復:
比較 所有基本比較,包括 >,>=,==,!=,<=,<, %in% 都是驗證陳述句。執行驗證陳述句時,%in% 運算子將替換為 %vin%。
邏輯運算 一元邏輯運算子 '!'、all() 和任何定義驗證陳述句。當 P 和 Q 中的 P 和 Q 正在驗證時,包括 &、&&、|、|| 在內的二進制邏輯運算正在驗證。(請注意,短路 && 和 & 僅回傳第一個邏輯值,在 P && Q、P 和/或 Q 是向量的情況下。二進制邏輯蘊涵 P ? Q(P 蘊含 Q)實作為好像 ( P ) Q . 后者被解釋為!(P) | Q。
另請注意,中的點names(.)指的是你的 data.frameconfront
https://cran.r-project.org/web/packages/validate/validate.pdf
rules <- validator(
speed >= 0,
dist >= 0,
if("names" %in% names(.)) is.character(names),
if("speed" %in% names(.)) is.character(speed),
if("speed" %in% names(.)) is.numeric(speed)
)
results <- confront(cars, rules)
summary(results)
name items passes fails nNA error warning expression
1 V1 50 50 0 0 FALSE FALSE (speed - 0) >= -0.00000001
2 V2 50 50 0 0 FALSE FALSE (dist - 0) >= -0.00000001
3 V3 1 1 0 0 FALSE FALSE !("names" %vin% names(.)) | (is.character(names))
4 V4 1 0 1 0 FALSE FALSE !("speed" %vin% names(.)) | (is.character(speed))
5 V5 1 1 0 0 FALSE FALSE !("speed" %vin% names(.)) | (is.numeric(speed))
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/414699.html
標籤:
上一篇:在回圈中訪問串列元素的名稱
下一篇:按特定順序合并兩個矩陣
