我在概括處理某些“問題資料”的方法時遇到了問題 - 串列的矢量化元素。(我不完全確定我是否準確地描述了這一點,所以請原諒我的無知)。
客觀的:
我正在嘗試編譯一個自動處理以下問題的函式,因為目的是重復運行/利用這種方法。
問題:
我已經通過單位名稱(傳感器來自的設備)從資料庫中提取了一些傳感器資料,通常傳感器資料作為向量(根據所需的結果 - 下面)但對于某些單位(資料收集器配置的地方)不同)它回傳一個向量串列。
向量中元素的數量與站點上的單元數相關(即,如果站點上有兩個單元,/01 和 /02,則向量將包含 2 個元素......等等)
我只想將與該單元相關的傳感器資料保存在相關列中。
并非所有單元都以相同的方式配置,所以我只打算在列的類已確認它是一個串列時運行一個函式。
傳感器及其標簽的數量每次都會不同(輸入到主函式中)。
預期方法:
- 對每一列執行以下檢查和糾正措施
- 檢查列類 - 檢查類是否為“串列”
- 如果為 FALSE,則什么都不做。
- 如果為 TRUE,則使用“unlist_func”(子函式)對每一行執行以下操作:
- 檢查'unit'列每一行的文本字串的結尾并提取unit_no
- 取消列出當前元素并選擇向量中與unit列中的unit_no對應的數字
- 將列類修改為
可重現的問題:
以下 tibble 是我正在使用的示例:
unit <- c('a2b7/01', 'a2b7/02', 'a2b7/03', 'a2b7/01', 'a2b7/02', 'a2b7/03', 'a2b7/01', 'a2b7/02', 'a2b7/03')
sen1 <- list(c(1,2,3), c(4,5,6), c(7,8,9), c(10,11,12), c(13,14,15), c(16,17,18), c(19,20,21), c(22,23,24), c(25,26,27))
sen2 <- list(1, 2, 3, 4, 5, 6, 7, 8, 9)
sensor_data <- tibble(unit, sen1, sen2)
期望的結果:
unit <- c('a2b7/01', 'a2b7/02', 'a2b7/03', 'a2b7/01', 'a2b7/02', 'a2b7/03', 'a2b7/01', 'a2b7/02', 'a2b7/03')
sen1 <- c(1,5,9,10,14,19,23,27)
sen2 <- c(1, 2, 3, 4, 5, 6, 7, 8, 9)
sensor_data_new <- tibble(unit, sen1, sen2)
到目前為止的嘗試和請求:
為了避免空手而歸,我已經發布了我打算使用的方法的草率版本,但我很抱歉,這是一項正在進行的作業,我很感激其中存在錯誤,但我希望能夠呼吁那里的人提供幫助,如果可能或建議不同的方法。
所有建議將不勝感激。
function(unit, sensors, date_from, date_to){
# ------ QUERYING TASK ------------------------
sensor_data <- 'pulls sensor info from unit names'
# ------ SUB FUNCTION - Unlist function -------
unlist_func <- function(df = sensor_data, j){
sensor_data_distinct <- df %>%
mutate(unit_no = str_extract(unit, '\\d$')) %>%
select(unit_no) %>%
distinct()
for (i in 1:nrow(df))
{
if(length(df[, j[[i]] ]) => 1 & str_ends(df$unit, sensor_data_distinct$unit_no)){
unlist(df[i, j])
df[sensor_data_distinct$unit_no]
} else(sensor_data[, j])
}
# ------- STAGE 1 CLEANSING FUNCTION -------------
# unit will always be in column 1 and datetime always in column 2
stg1_cleanse <- for(j in 3:ncol(sensor_data)) { # for-loop over columns
if (is.list(sensor_data[, j]) == TRUE){
lapply(unlist_func.....)
}
}
}
# ------- STAGE 1 CLEANSING FUNCTION -------------
stg2_cleanse <- 'further cleansing routine'
}
uj5u.com熱心網友回復:
我認為您可以大大簡化您的功能。這似乎產生了您想要的結果。自定義函式extract_func實作了檢查每一行長度的規則。如果是單元素值,則回傳單個元素;如果它是一個向量,則回傳請求索引處的元素。然后我們可以使用 dplyrrowwise和across函式將此函式應用于列“sen1”和“sen2”,傳遞“unit_num”作為索引引數(在需要時)。
library(tidyverse)
unit <- c('a2b7/01', 'a2b7/02', 'a2b7/03', 'a2b7/01', 'a2b7/02', 'a2b7/03', 'a2b7/01', 'a2b7/02', 'a2b7/03')
sen1 <- list(c(1,2,3), c(4,5,6), c(7,8,9), c(10,11,12), c(13,14,15), c(16,17,18), c(19,20,21), c(22,23,24), c(25,26,27))
sen2 <- list(1, 2, 3, 4, 5, 6, 7, 8, 9)
sensor_data <- tibble(unit, sen1, sen2)
extract_func <- function(data, idx) {
# check for NULL data and convert to NA if it is present
if (is.null(data)) {
data <- NA
}
if (length(data) == 1) {
return(data[1])
} else {
return(data[idx])
}
}
sensor_data_clean <- sensor_data %>%
rowwise() %>%
mutate(
unit_num = as.numeric(str_extract(unit, '\\d$')),
across(c(sen1, sen2), ~extract_func(., unit_num), .names = 'extract_{.col}')
)
# A tibble: 9 × 6
# Rowwise:
unit sen1 sen2 unit_num extract_sen1 extract_sen2
<chr> <list> <list> <dbl> <dbl> <dbl>
1 a2b7/01 <dbl [3]> <dbl [1]> 1 1 1
2 a2b7/02 <dbl [3]> <dbl [1]> 2 5 2
3 a2b7/03 <dbl [3]> <dbl [1]> 3 9 3
4 a2b7/01 <dbl [3]> <dbl [1]> 1 10 4
5 a2b7/02 <dbl [3]> <dbl [1]> 2 14 5
6 a2b7/03 <dbl [3]> <dbl [1]> 3 18 6
7 a2b7/01 <dbl [3]> <dbl [1]> 1 19 7
8 a2b7/02 <dbl [3]> <dbl [1]> 2 23 8
9 a2b7/03 <dbl [3]> <dbl [1]> 3 27 9
由于您只是檢查向量的長度然后提取單個元素,因此您可以在其中執行以下行內操作mutate(盡管像上面這樣的預定義自定義函式為您將來提供了更大的靈活性)。
sensor_data_clean <- sensor_data %>%
rowwise() %>%
mutate(
unit_num = as.numeric(str_extract(unit, '\\d$')),
across(c(sen1, sen2), ~(.[min(length(.), unit_num)]), .names = 'extract_{.col}')
)
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/388291.html
上一篇:根據條件為每個唯一客戶填充True/False的新列
下一篇:Django-在一行中回圈
