如何根据时间序列的列值提取日期?

问题描述 投票:2回答:3

假设我有:

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])
r loops xts
3个回答
0
投票

从原始data对象开始,您可以先创建一个小标题,然后将其融化以得到所需的格式:

library(tidyverse)

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

0
投票

使用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) colnames(data)[which(data[, x] == 1)]))
names(one_days) <- rown

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

0
投票

如果特定行有多个1,而您只想为该行返回一次索引,则可以使用rowSums并将index子集化>

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

如果需要每个1的索引值,可以将whicharr.ind = TRUE结合使用

zoo::index(data)[which(data == 1, arr.ind = TRUE)[, 1]]
© www.soinside.com 2019 - 2024. All rights reserved.