我有一個資料框架,其中包含幾個月內測量的氡氣月平均值。我已將每個值標記為“低于”或“高于”閾值,并想計算平均值的次數:“低于”、“高于”、“高于”或“低于”以下”。
df <- data.frame(value = c(130, 200, 240, 230, 130),
level = c("below", "above","above","above", "below"))
對這里的 Matlab 答案進行一些深入研究表明我們可以使用 Matrix 包:
require(Matrix)
sparseMatrix(i=c(2,2,2,1), j=c(2,2,2))
產生這個我還不能解釋的結果。
[1,] | |
[2,] | .
關于 tidyverse 方法的任何想法?
uj5u.com熱心網友回復:
您可以使用基礎 R 中的表格:
table(df$level[-1], df$level[-nrow(df)])
above below
above 2 1
below 1 0
uj5u.com熱心網友回復:
當然,只需使用 group by 并計算值
library(dplyr)
df <- data.frame(value = c(130, 200, 240, 230, 130),
level = c("below", "above","above","above", "below"))
df %>%
group_by(grp = paste(level, lead(level))) %>%
summarise(n = n()) %>%
# drop the observation that does not have a "next" value
filter(!grepl(pattern = "NA", x = grp))
#> # A tibble: 3 × 2
#> grp n
#> <chr> <int>
#> 1 above above 2
#> 2 above below 1
#> 3 below above 1
uj5u.com熱心網友回復:
不運行,所以可能有錯別字,但你明白了。我會讓你來處理 na 和第一個 obs。單程通過向量。
library(dplyr)
summarize(increase = sum(case_when(value > lag(value) ~ 1, T ~ 0)),
decrease = sum(case_when(value > lag(value) ~ 1, T ~ 0)),
constant = sum(case_when(value = lag(value) ~ 1, T ~ 0))
)
uj5u.com熱心網友回復:
一個稍微不同的版本:
library(dplyr)
library(stringr)
df %>%
group_by(level = str_c(level, lead(level), sep = " ")) %>%
count(level) %>%
na.omit()
level n
<chr> <int>
1 above above 2
2 above below 1
3 below above 1
uj5u.com熱心網友回復:
另一種可能的解決方案:
library(tidyverse)
df<-data.frame(value=c(130,200, 240, 230, 130),level=c("below", "above","above","above", "below"))
df %>%
mutate(changes = str_c(lag(level), level, sep = "_")) %>%
count(changes) %>% drop_na(changes)
#> changes n
#> 1 above_above 2
#> 2 above_below 1
#> 3 below_above 1
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/368695.html
上一篇:Ruby中兩個變數值之間的空格
