簡體   English   中英

如何根據時間序列列的值提取日期?

[英]How do I extract dates based on values of columns of a time series?

假設我有:

A <- c(1,0,0,0)
B <- c(0,1,0,0)
C <- c(0,0,1,0)
D <- c(0,0,0,1)
data <- xts(cbind(A,B,C,D),order.by = as.Date(1:4))

然后我得到...

           A B C D
1970-01-02 1 0 0 0
1970-01-03 0 1 0 0
1970-01-04 0 0 1 0
1970-01-05 0 0 0 1

我想提取值為 1 的每一列的日期。所以我想看到這樣的東西......

A "1970-01-02"
B "1970-01-03"
C "1970-01-04"
D "1970-01-05"

這是獲得答案的手動方式。 所以我基本上想運行一個可以做到這一點的循環......

index(data$A[data$A==1])
index(data$B[data$B==1])
index(data$C[data$C==1])
index(data$D[data$D==1])

如果對於特定行有多個 1,並且您只想為該行返回一次索引,我們可以使用rowSums並子集index

zoo::index(data)[rowSums(data == 1) > 0]
#[1] "1970-01-02" "1970-01-03" "1970-01-04" "1970-01-05"

如果我們想要每個 1 的索引值,我們可以使用which with arr.ind = TRUE

zoo::index(data)[which(data == 1, arr.ind = TRUE)[, 1]]

要同時獲取列名和索引,我們可以重用which的矩陣

mat <- which(data == 1, arr.ind = TRUE)
data.frame(index = zoo::index(data)[mat[, 1]], column = colnames(data)[mat[,2]])

#       index column
#1 1970-01-02      A
#2 1970-01-03      B
#3 1970-01-04      C
#4 1970-01-05      D

從您的原始data object 開始,您可以先創建一個 tibble,然后將其融合以獲得所需的格式:

library(tidyverse)

as_tibble(data) %>% 
  mutate(time = time(data)) %>% 
  gather("group", "value", -time) %>% 
  filter(value == 1) %>% 
  select(group, time)

使用sapply ,我返回行中有1的行名。 如果連續有多個1 ,這應該可以工作。

one_days <- as.Date(unlist(
    sapply(1:ncol(data), 
     function(x) time(data)[which(data[, x] == 1)])))

# "1970-01-02" "1970-01-03" "1970-01-04" "1970-01-05"

如果你也想要行名。

rown <-  unlist(sapply(1 : ncol(data), function(x) rep(colnames(data)[x], sum(data[, x]))))
names(one_days) <- rown

#           A              B            C            D
# "1970-01-02"  "1970-01-03" "1970-01-04" "1970-01-05"

測試多個 1

A <- c(1,1,0,0)
one_days <- as.Date(unlist(
     sapply(1:ncol(data),
      function(x) time(data)[which(data[, x] == 1)])))
rown <-  unlist(sapply(1 : ncol(data), function(x) rep(colnames(data)[x], sum(data[, x]))))
names(one_days) <- rown
one_days
#           A            A            B            C            D
#"1970-01-02" "1970-01-03" "1970-01-03" "1970-01-04" "1970-01-05"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM