【问题标题】:R Date format changed after sapplyR日期格式在sapply后更改
【发布时间】:2021-12-18 08:50:15
【问题描述】:
age <- c(22,24,NA,27)
duedate <- as.Date(c("1/1/2020",NA,"1/30/2020","12/31/2021"), format="%m/%d/%Y")
df <- data.frame(age,duedate)

Minimum <- sapply(df, function(x) min(x,na.rm=T))
Maximum <- sapply(df, function(x) max(x,na.rm=T))
tbl <- data.frame(min_scale,max_Scale)
print(tbl)
tbl[2,1] <- as.Date(tbl[2,1],origin = "1970-01-01") #Do not work

制作表格后,日期已更改为数值,我无法将其返回。 有什么建议吗?我想像正确的表格一样显示日期。 我想尽可能地自动完成,因为我有很多变量。

【问题讨论】:

  • 使用lapply 而不是sapply。向量中不能有混合类型。由于 Age 无法转换为日期,因此 Age 和 Duedate 都将转换为数值。如果您使用lapply 获取列表,则可以有混合类型。但即便如此,您也不能在 data.frame 的列中使用混合类型。如果这只是为了让事情看起来更漂亮,您需要将所有内容转换为字符串/字符值以保留格式。
  • R 中的日期是数字类型,因此当属性在简化为数组的过程中被删除时,日期会显示它们的基础值。当前的代码没有意义,因为名称 min_scale 和 max_scale 显然应该是最小值和最大值。

标签: r date sapply


【解决方案1】:

您可以使用基本函数摘要并省略您不感兴趣的统计数据:

summary(df)[c(1,6), ]  # for numeric values min and max are the 1st and 6th rows.
#-------------------------
      age           duedate          
 Min.   :22.00   Min.   :2020-01-01  
 Max.   :27.00   Max.   :2021-12-31  

【讨论】:

    【解决方案2】:

    这有点简单,并导致数据框的方向与df 相同,ageduedate 在单独的列中:

    tbl <- as.data.frame(rbind(Minimum, Maximum))
    tbl$duedate <- as.Date(tbl$duedate, "1970-01-01")
    tbl
    #         age    duedate
    # Minimum  22 2020-01-01
    # Maximum  27 2021-12-31
    

    【讨论】:

    • 我调换了桌子,得到了我想要的。谢谢!
    【解决方案3】:

    使用dplyrtidyr 的解决方案。这适用于多列。

    library(dplyr)
    library(tidyr)
    
    df2 <- df %>%
      summarize(across(.fns = list(Min = min, Max = max), na.rm = TRUE)) %>% # Apply min and max function
      mutate(across(.fns = as.character)) %>%                                # Convert all columns to character
      pivot_longer(everything(), names_to = "Parameter") %>%                 # Convert to long format
      separate(Parameter, into = c("Parameter", "Statistics")) %>%           # Separate the Parameter columns
      pivot_wider(names_from = "Statistics", values_from = "value")          # Convert to wide format
    
    df2
    # # A tibble: 2 x 3
    #   Parameter Min        Max       
    #   <chr>     <chr>      <chr>     
    # 1 age       22         27        
    # 2 duedate   2020-01-01 2021-12-31  
    

    【讨论】:

      猜你喜欢
      • 2015-01-27
      • 2015-03-03
      • 2011-11-18
      • 1970-01-01
      • 2019-01-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多