【问题标题】:Array of lists in R - Convert them to OriginR中的列表数组-将它们转换为Origin
【发布时间】:2021-05-09 17:45:11
【问题描述】:

在 R 中,我有一个名为“test [[]]”的列表数组,其中列表显示的数据如下:

X44231 X44232 X44233 X44234 X44235 X44236 X44237 X44238
1     100      0      0      0      0      0      0      0
2       0      0      0      0      0      0      0      0
3       0      0      0      0      0      0      0      0
4     100      0      0      0      0      0    200      0
5       0      0      0      0      0      0      0      0
6     700    900      0      0   1100   1200   1200   1200
7       0      0      0      0      0      0      0      0
8       0      0      0      0      0      0      0      0
9       0      0      0      0      0      0      0      0
10      0      0      0      0      0      0      0      0
11      0      0      0      0      0      0      0      0
12      0      0      0      0      0      0      0      0
13      0      0      0      0      0      0      0      0
14      0      0      0      0      0      0      0      0
15      0      0      0      0      0      0      0      0

有些列以 X 和一个数字命名,我需要将它们转换为 origin = "1899-12-30",但我不知道如何将此规则应用于列标题并且仍然取 X不碍事(注意:不是我必须应用此转换的所有列)

转换示例:

as.Date(44228, origin = "1899-12-30")

【问题讨论】:

    标签: r arrays list


    【解决方案1】:

    我希望这就是你要找的东西

    library(tidyverse)
    
    read.table(text = "X44231 X44232 X44233 X44234 X44235 X44236 X44237 X44238
    1     100      0      0      0      0      0      0      0
    2       0      0      0      0      0      0      0      0
    3       0      0      0      0      0      0      0      0
    4     100      0      0      0      0      0    200      0
    5       0      0      0      0      0      0      0      0
    6     700    900      0      0   1100   1200   1200   1200
    7       0      0      0      0      0      0      0      0
    8       0      0      0      0      0      0      0      0
    9       0      0      0      0      0      0      0      0
    10      0      0      0      0      0      0      0      0
    11      0      0      0      0      0      0      0      0
    12      0      0      0      0      0      0      0      0
    13      0      0      0      0      0      0      0      0
    14      0      0      0      0      0      0      0      0
    15      0      0      0      0      0      0      0      0", header = T) ->df
       
    names(df) %>% 
       str_remove("X") %>% 
       as.numeric() %>% 
       as.Date(origin = "1899-12-30") -> c_names
    
    names(df) <- c_names
    df
    #>    2021-02-04 2021-02-05 2021-02-06 2021-02-07 2021-02-08 2021-02-09 2021-02-10
    #> 1         100          0          0          0          0          0          0
    #> 2           0          0          0          0          0          0          0
    #> 3           0          0          0          0          0          0          0
    #> 4         100          0          0          0          0          0        200
    #> 5           0          0          0          0          0          0          0
    #> 6         700        900          0          0       1100       1200       1200
    #> 7           0          0          0          0          0          0          0
    #> 8           0          0          0          0          0          0          0
    #> 9           0          0          0          0          0          0          0
    #> 10          0          0          0          0          0          0          0
    #> 11          0          0          0          0          0          0          0
    #> 12          0          0          0          0          0          0          0
    #> 13          0          0          0          0          0          0          0
    #> 14          0          0          0          0          0          0          0
    #> 15          0          0          0          0          0          0          0
    #>    2021-02-11
    #> 1           0
    #> 2           0
    #> 3           0
    #> 4           0
    #> 5           0
    #> 6        1200
    #> 7           0
    #> 8           0
    #> 9           0
    #> 10          0
    #> 11          0
    #> 12          0
    #> 13          0
    #> 14          0
    #> 15          0
    

    reprex package (v0.3.0) 于 2021-02-05 创建

    【讨论】:

      【解决方案2】:

      这是一个函数,它尝试处理列名不是"Xnnnn" 形式的情况,n 十进制数字。

      convertDate <- function(x){
        y <- sub("^X", "", x)
        d <- as.Date(as.integer(y), origin = "1899-12-30")
        na <- is.na(d)
        d[na] <- x[na]
        d
      }
      
      convertDate(x)
      #[1] "2021-02-04" "2021-02-05" "2021-02-06" "2021-02-07"
      #[5] "2021-02-08" "2021-02-09" "2021-02-10" "2021-02-11"
      

      要更改列名,请将此函数的返回值分配给names(test)colnames(test)

      names(test) <- convertDate(names(test))
      

      数据

      x <- scan(what = character(),
                text = "X44231 X44232 X44233 X44234 X44235 X44236 X44237 X44238")
      

      【讨论】:

        【解决方案3】:

        如果你想坚持基础 R:

        #reproducible example
        df <- as.data.frame(matrix(c(100,0,0,100),2))
        colnames(df) <- c("X44231", "X44232")
        
        #actual code
        colnames(df) <- as.Date(as.numeric(gsub("X","",colnames(df))), origin = "1899-12-30")
        df
        

        产量

          2021-02-04 2021-02-05
        1        100          0
        2          0        100
        

        【讨论】:

          猜你喜欢
          • 2022-01-18
          • 1970-01-01
          • 1970-01-01
          • 2020-10-15
          • 2022-11-14
          • 1970-01-01
          • 2016-01-05
          • 2023-03-28
          • 1970-01-01
          相关资源
          最近更新 更多