我面臨計算列中值的中位數的問題。我在一列中有數百個值,但我想一次計算序列中五個值的中值,并將中值存盤在 R 中的單獨資料框中,并類似地繼續直到可用資料值結束。
問題是#VALUE有一些值!在計算中位數時,如果有這樣的值,即#VALUE!并且要取中位數的值少于 5 個,那么程式應該只取具有任何可用值數量的中位數。類似地,對于最后一個中值,如果可取的值少于 5 個,則應使用可用值數計算中值。
可以從此處下載帶有一列示例資料的 .csv 檔案的鏈接。
檔案鏈接
如果有人能幫助我解決這個問題,我將不勝感激。
謝謝
uj5u.com熱心網友回復:
你可以試試這個:
- 按 5 行的序列分組
- 替換
#VALUE!為NA - 轉換為數字
- 用中位數總結
Speed %>%
group_by(group5 = rep(row_number(), each=5, length.out = n())) %>%
mutate(speed = ifelse(speed== "#VALUE!", NA, speed)) %>%
type.convert(as.is = TRUE) %>%
summarise(median = median(speed, na.rm = TRUE))
group5 median
<int> <dbl>
1 1 1.32
2 2 -4.97
3 3 -13.1
4 4 -14.3
5 5 6.89
6 6 -2.97
7 7 -11.6
8 8 -16.0
9 9 -18.6
10 10 -19.9
# ... with 72 more rows
uj5u.com熱心網友回復:
更新“翻滾視窗”(頂部,此處)與“滾動視窗”(下方,保留以供后代/參考)。仍在使用dat滾動視窗討論的頂部。
關于#VALUE!(遠在下面)的討論可能仍然相關,我將在此處包含代碼。
基數R
dat$speed <- suppressWarnings(as.numeric(dat$speed))
aggregate(dat$speed, list(grp = (seq_len(nrow(dat)) - 1) %/% 5), FUN = median, na.rm = TRUE)
# grp x
# 1 0 3.4245
# 2 1 -4.9730
dplyr
library(dplyr)
dat %>%
mutate(speed = suppressWarnings(as.numeric(speed))) %>%
group_by(grp = (seq_len(n()) - 1) %/% 5) %>%
summarize(med5 = median(speed, na.rm = TRUE))
# # A tibble: 2 x 2
# grp med5
# <dbl> <dbl>
# 1 0 3.42
# 2 1 -4.97
資料表
library(data.table)
as.data.table(dat)[, speed := suppressWarnings(as.numeric(speed))
][, .(med5 = median(speed, na.rm = TRUE)), by = .(grp = (seq_len(nrow(dat)) - 1) %/% 5)][]
# grp med5
# <num> <num>
# 1: 0 3.4245
# 2: 1 -4.9730
(下面是滾動視窗,除了dat資料的定義之外不再相關。)
我從那個單列框架中復制了前 10 行,然后得到
dat <- structure(list(speed = c(0, 5.534, 1.315, 7.6865, -0.479, -0.4605, -4.311, -4.973, -7.69, -11.669)), row.names = c("1", "2", "3", "4", "5", "6", "7", "8", "9", "10"), class = "data.frame")
有了這個,基本的操作是這樣的:
newvec <- zoo::rollmedian(dat$speed, 5)
newvec
# [1] 1.3150 1.3150 -0.4605 -0.4790 -4.3110 -4.9730
請注意,這會創建nrow(dat) - (k - 1)(20) 個值,其中k=5(您的視窗)。一般來說,滾動操作往往是還原性的,但如果需要,我們可以選擇更改它。例如,我們可以保持相同的長度并用NA;填充末端。為此,我們可以將視窗向左、居中或向右“對齊”:
zoo::rollmedian(dat$speed, 5, fill = NA, align = "left")
# [1] 1.3150 1.3150 -0.4605 -0.4790 -4.3110 -4.9730 NA NA NA NA
zoo::rollmedian(dat$speed, 5, fill = NA, align = "center")
# [1] NA NA 1.3150 1.3150 -0.4605 -0.4790 -4.3110 -4.9730 NA NA
zoo::rollmedian(dat$speed, 5, fill = NA, align = "right")
# [1] NA NA NA NA 1.3150 1.3150 -0.4605 -0.4790 -4.3110 -4.9730
讓我展示一下對齊方式是如何適應的。使用align="center"(默認),我們看到:
dat$speed
# [1] 0.0000 5.5340 1.3150 7.6865 -0.4790 -0.4605 -4.3110 -4.9730 -7.6900 -11.6690
### `----------------------------------------'
### take the median of these values,
### and then assign that single value here:
### /
### ,---------------'
### /
# [1] NA NA 1.3150 1.3150 -0.4605 -0.4790 -4.3110 -4.9730 NA NA
dat$speed[1:5]
# [1] 0.0000 5.5340 1.3150 7.6865 -0.4790
median(dat$speed[1:5])
# [1] 1.315
對于下一個值,
# [1] 0.0000 5.5340 1.3150 7.6865 -0.4790 -0.4605 -4.3110 -4.9730 -7.6900 -11.6690
### `----------------------------------------'
### take the median of these values,
### and then assign that single value here:
### /
### ,---------------'
### /
# [1] NA NA 1.3150 1.3150 -0.4605 -0.4790 -4.3110 -4.9730 NA NA
dat$speed[2:6]
# [1] 5.5340 1.3150 7.6865 -0.4790 -0.4605
median(dat$speed[2:6])
# [1] 1.315
因此,我們可以輕松地將其分配給data.frame(rollmed = newvec)帶有或不帶有填充的新框架。如果要將其分配回原始框架,可以執行以下操作:
dat$rollmed <- zoo::rollmedian(dat$speed, 5, fill = NA, align = "center")
dat
# speed rollmed
# 1 0.0000 NA
# 2 5.5340 NA
# 3 1.3150 1.3150
# 4 7.6865 1.3150
# 5 -0.4790 -0.4605
# 6 -0.4605 -0.4790
# 7 -4.3110 -4.3110
# 8 -4.9730 -4.9730
# 9 -7.6900 NA
# 10 -11.6690 NA
至于您的#VALUE!,這可能表現為一character列而不是numeric,在這種情況下,您在上述所有內容之前還有一個額外的步驟。
我會將我的值之一更改為該錯誤:
dat$speed[5] <- "#VALUE!"
dat
# speed
# 1 0
# 2 5.534
# 3 1.315
# 4 7.6865
# 5 #VALUE!
# 6 -0.4605
# 7 -4.311
# 8 -4.973
# 9 -7.69
# 10 -11.669
str(dat)
# 'data.frame': 10 obs. of 1 variable:
# $ speed: chr "0" "5.534" "1.315" "7.6865" ...
(看到了嗎?chr。)
從這里,我們可以簡單地將所有轉換為數字,忽略我們得到的警告:
dat$speed <- suppressWarnings(as.numeric(dat$speed))
dat
# speed
# 1 0.0000
# 2 5.5340
# 3 1.3150
# 4 7.6865
# 5 NA
# 6 -0.4605
# 7 -4.3110
# 8 -4.9730
# 9 -7.6900
# 10 -11.6690
str(dat)
# 'data.frame': 10 obs. of 1 variable:
# $ speed: num 0 5.53 1.31 7.69 NA ...
從這里開始,我們可以再次進行滾動中位數。請注意,NA我們現在稍微改變了一些東西:
dat$rollmed <- zoo::rollmedian(dat$speed, 5, fill = NA, align = "center")
dat$rollmed2 <- zoo::rollmedian(dat$speed, 5, fill = NA, align = "center", na.rm = TRUE)
dat
# speed rollmed rollmed2
# 1 0.0000 NA NA
# 2 5.5340 NA NA
# 3 1.3150 NA 3.42450
# 4 7.6865 NA 3.42450
# 5 NA NA 0.42725
# 6 -0.4605 NA -2.38575
# 7 -4.3110 NA -4.64200
# 8 -4.9730 -4.973 -4.97300
# 9 -7.6900 NA NA
# 10 -11.6690 NA NA
默認值(我們之前所做的)將為前一個NA /- 4 行 ( k-1)內的每一行回傳一個中值#VALUE!;na.rm=TRUE如果您愿意,我們可以添加;這不是一個滾動視窗的事情,這是一個一般的統計問題,“空值是一個問題”。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/376579.html
下一篇:坐標輸出到csv檔案python
