我首先要說的是,我完全意識到以前已經回答過類似的問題,但是經過數小時的閱讀和故障排除后,我相信我遇到了一個獨特的問題。抱歉,如果我遺漏了什么。在投票率很高的類似問題中給出的答案指向資料中的 NA,但正如我的問題中所解釋的,我似乎沒有任何答案,也不知道它們可能會出現在哪里。
我正在使用 lubridate、readr 和 dplyr 包在 R 4.1.2 中運行一個 for 回圈,該包旨在將個人在通過可靠性測驗之前獲取的無效資料標記為無效資料。測驗對特定群體是唯一的,因此一個人可能對一個群體、許多、全部或一個都不可靠。我撰寫的函式旨在獲取資料幀“x”,并且對于每個單獨的觀察者,檢查資料點是否對具有觀察者列(觀察者)、測驗通過日期(begin_valid)的資料幀“鍵”有效,以及它們現在對 (group_valid) 有效的組。如果他們通過了多個測驗,則每個觀察者的鍵可能有多行。我使用 Lubridate 包中的工具為日期創建 POSIXct 值,這些日期可以進行算術操作并相互比較。用戶可以設定 y = "
invalidata <- function(x, y){
library(lubridate)
library(readr)
library(dplyr)
x$valid <- rep(1, length(rownames(x)))
alts <- 0
key <- read_csv("updatable csv file")
key$begin_valid <- parse_date_time(key$begin_valid, c("mdy", "dmy", "ydm", "mdy"), tz= "Africa/Lubumbashi")
for(i in unique(x$observer)){
subkey <- subset(key, key$observer == i)
subx <- subset(x, x$observer == i)
if(is.na(subkey$begin_valid) == TRUE || is.na(subkey$group_valid) == TRUE){ #if reliable for nothing, remove
x[x$observer == i]$valid <- 0
print("removed completely unreliable")
}else{
for(j in rownames(subx)){
if(subx$group[j] %in% subkey$group_valid == FALSE && "All" %in% subkey$group_valid == FALSE){ #if not reliable for specific group or all groups, remove
x$valid[j] <- 0
print("removed unreliable for group")
}
if(subx$group[j] %in% subkey$group_valid){ #remove if before reliability date for group
if(subx$date[j] < subset(subkey, subkey$group_valid == subx$group[j])$begin_valid){
x$valid[j] <- 0
print("removed pre-reliability")
}
} else{ #remove if not reliable for specific group, and before reliability date for all
if(subx$date[j] < subset(subkey, subkey$group_valid == "All")$begin_valid){
x$valid[j] <- 0
print("removed pre-reliability")
}
}
}
}
}
if(y == "remove"){ #remove all invalid data and validity column
x <- subset(x, x$valid == 1)
x <- select(x, -valid)
}
return(x)}
我的問題是線路
if(subx$date[j] < subset(subkey, subkey$group_valid == "All")$begin_valid)
回傳錯誤:
if (subx$date[j] < subset(subkey, subkey$group_valid == >"All")$begin_valid) { 中的錯誤:需要 TRUE/FALSE 的缺失值
但是,當我在括號內運行代碼時
subx$date[j] < subset(subkey, subkey$group_valid == "All")$begin_valid
在回圈的背景關系之外,我收到相關的 TRUE 或 FALSE 值。我檢查了所有日期的任何 NULL 或 NA 值,并在代碼的上一步中使用 NA 處理了任何資料:
if(is.na(subkey$begin_valid) == TRUE || is.na(subkey$group_valid) == TRUE){}
else{ #code at issue }
我對這條非常相似的線路沒有問題:
if(subx$date[j] < subset(subkey, subkey$group_valid == subx$group[j])$begin_valid){
My best guess is that something may be going wrong with the date formatting? I know that this error is usually a symptom of NULLs or NAs floating in the data, but for the life of me I cannot figure out where they could be coming from. Dates in "x" have already been parsed and contain no NAs or NULLs. I have not included the data as it is proprietary, but I can come up with mock data if people are interested/think it would be necessary. Thank you in advance for reading through and for any thoughts/troubleshooting suggestions!
MRE:
dput output for x:
structure(list(date = structure(c(1486764000, 1486764000, 1486850400,
1486936800, 1487023200, 1487109600, 1487109600, 1487196000, 1487196000,
1487368800, 1487368800, 1487368800, 1487368800, 1487368800, 1487368800,
1487455200, 1487455200, 1487455200, 1487541600, 1487887200), class = c("POSIXct",
"POSIXt"), tzone = "Africa/Lubumbashi"), time = structure(c(23734,
53419, 41352, 33034, 24220, 34812, 35624, 27949, 27950, 49192,
49286, 49392, 49401, 62719, 62725, 26046, 26047, 27246, 46611,
61228), class = c("hms", "difftime"), units = "secs"), observer = c("MA",
"LE", "VI", "VI", "MI", "MA", "MA", "ME", "VI", "BA", "MA", "BA",
"MA", "ME", "MI", "MA", "BA", "MI", "BA", "MA"), group = c("EKK",
"EKK", "KKL", "EKK", "KKL", "KKL", "KKL", "EKK", "EKK", "EKK",
"EKK", "EKK", "EKK", "KKL", "KKL", "EKK", "EKK", "KKL", "EKK",
"KKL")), row.names = c(NA, -20L), spec = structure(list(cols = list(
date = structure(list(), class = c("collector_character",
"collector")), time = structure(list(format = ""), class = c("collector_time",
"collector")), observer = structure(list(), class = c("collector_character",
"collector")), group = structure(list(), class = c("collector_character",
"collector"))), default = structure(list(), class = c("collector_guess",
"collector")), delim = ","), class = "col_spec"), problems = <pointer: 0x000001f6f2f7af70>, class = c("spec_tbl_df",
"tbl_df", "tbl", "data.frame"))
for the key:
structure(list(observer = c("BA", "MI", "VI", "ME", "DA", "OK",
"FR", "MA", "LA", "DE", "JD", "JD", "JD", "BR", "DA", "DA", "PA",
"PA", "JA", "JE", "DI", "JP", "LE", "MR", "NG", "TR", "TE"),
begin_valid = c("8/12/2016", "12/21/2019", "8/11/2016", "8/11/2016",
"12/11/2019", "12/17/2019", "12/11/2019", "11/2/2016", "1/11/2020",
"12/12/2019", "12/16/2019", "12/16/2019", "11/22/2020", "6/19/2021",
"11/26/2020", "11/26/2020", "7/25/2021", "7/25/2021", NA,
NA, NA, NA, NA, NA, NA, NA, NA), group_valid = c("All", "All",
"All", "All", "All", "All", "FKK", "All", "FKK", "FKK", "EKK",
"KKL", "All", "EKK", "EKK", "KKL", "EKK", "KKL", NA, NA,
NA, NA, NA, NA, NA, NA, NA), subgroup = c(NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, "S", NA, NA, NA, "S", NA, "N",
NA, NA, NA, NA, NA, NA, NA, NA, NA)), row.names = c(NA, -27L
), spec = structure(list(cols = list(observer = structure(list(), class = c("collector_character",
"collector")), begin_valid = structure(list(), class = c("collector_character",
"collector")), group_valid = structure(list(), class = c("collector_character",
"collector")), subgroup = structure(list(), class = c("collector_character",
"collector"))), default = structure(list(), class = c("collector_guess",
"collector")), delim = ","), class = "col_spec"), class = c("spec_tbl_df",
"tbl_df", "tbl", "data.frame"))
uj5u.com熱心網友回復:
此代碼中有兩個錯誤:
因為
rownames(.)回傳字串,所以不能使用subx$group[j]. 兩種選擇:- 首選。使用
for (j in seq_len(nrow(subx))),并且所有參考都可以正常作業。 - 保留
for(j in rownames(subx)),但將所有subx$參考更改為類似于subx[j,"group"].
- 首選。使用
x[x$observer == i]$valid是錯誤的代碼,更改為x$valid[x$observer == i].
在這兩個更改之后,您的代碼運行沒有錯誤,并且在此示例中"removed pre-reliability",在控制臺上列印了四次。
在進行故障排除時,您不能混合subx$group[1]和subx$group["1"],它們非常不同,后者(如預期的那樣)會產生NA.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/405555.html
標籤:
上一篇:if陳述句同時運行怎么辦
