【问题标题】:How to aggregate a character and a numeric value without receiving invalid character error如何在不接收无效字符错误的情况下聚合字符和数值
【发布时间】:2019-09-17 09:45:11
【问题描述】:

我想绘制以下数据:

structure(list(`Sunday NightShifts` = c(2, 3, 3, 3, 3), 
               time = c("t0400_0415_d1", "t0415_0430_d1", "t0430_0445_d1", "t0445_0500_d1", "t0500_0515_d1"),
               day = c("Sunday", "Sunday", "Sunday", "Sunday", "Sunday"), 
              `Monday NightShifts` = c(NA_real_, NA_real_, NA_real_, NA_real_, NA_real_), 
              `Tuesday NightShifts` = c(NA_real_, NA_real_, NA_real_, NA_real_, NA_real_), 
              `Wednesday NightShifts` = c(NA_real_, NA_real_, NA_real_, NA_real_, NA_real_), 
              `Thursday NightShifts` = c(NA_real_, NA_real_, NA_real_, NA_real_, NA_real_), 
              `Friday NightShifts` = c(NA_real_, NA_real_, NA_real_, NA_real_, NA_real_)), 
              row.names = c(NA, 5L), class = "data.frame")

使用 tidyverse plot 我的代码如下:

df <- as_data_frame(NightShifts) %>% 
  mutate(timeofday = rownames(NightShifts)) %>% 
mutate(timeofday = as.POSIXct(paste0("2000-01-01 ", timeofday, ":00")))


df_long <- df %>% 
            gather("activity", "value", -timeofday) %>% 
            group_by(timeofday) %>% 
       mutate(rel_value = value / sum(value))

然而,在上述(mutate(rel_value = value / sum(value))) 行之后,我收到以下错误:

Error in sum(value) : invalid 'type' (character) of argument

这是因为NA的吗?

# plot the values as an area-plot
ggplot(df_long, aes(x = timeofday, y = rel_value, fill = activity)) + geom_area(aes(fill=activity)) + labs(x="Time", y="Probabilities", colour="NightShifts", fill="NightShifts") + 

  theme(legend.position="right", axis.text.x = element_text(angle = 90, hjust = 1))

我运行一个回溯():

11: eval(cols[[col]], .data, parent.frame())
10: eval(cols[[col]], .data, parent.frame())
9: mutate(., rel_value = value/sum(value))
8: function_list[[k]](value)
7: withVisible(function_list[[k]](value))
6: freduce(value, `_function_list`)
5: `_fseq`(`_lhs`)
4: eval(quote(`_fseq`(`_lhs`)), env, env)
3: eval(quote(`_fseq`(`_lhs`)), env, env)
2: withVisible(eval(quote(`_fseq`(`_lhs`)), env, env))
1: df %>% gather("activity", "value", -timeofday) %>% group_by(timeofday) %>% 
       mutate(rel_value = value/sum(value))

您能帮我解决这个错误吗?

我还有一个基本问题如何更改此代码

as.POSIXct(paste0("2000-01-01 ", timeofday, ":00")))

从 04:00 到 03:45 以小时和分钟显示时间(不包括日期)。

非常感谢

【问题讨论】:

  • 不,这不是因为NAs。当您2 + "t0400_0415_d1" 时,您期望得到什么答案?
  • @RonakShah 谢谢,所以基本上我需要将 t0400_0415_d1 转换为数字?

标签: r dataframe ggplot2 tidyr dplyr


【解决方案1】:

如果我们需要以分钟为单位的单位差异,请将“时间”列分成两个(“时间1”,“时间2”)extract(来自tidyr),转换为日期时间类(as.POSIXct)得到列之间的差异并添加“周日夜班”列

library(tidyverse)
NightShifts %>% 
   extract(time, into = c("time1", "time2"), 
         "^t(\\d+)_(\\d+)_.*", remove = FALSE) %>%
   mutate_at(vars(time1, time2), as.POSIXct, format = "%H%M") %>% 
   mutate(Diff = as.numeric(difftime(time2, time1, unit = "min") + 
            `Sunday NightShifts`))

【讨论】:

  • 感谢您的帮助和时间-好主意-当我运行代码时收到以下错误错误[.data.frame(., time, into = c("time1", "time2" ), "^t(\\d+)_(\\d+)_.*", : 未使用的参数 (into = c("time1", "time2"), remove = FALSE)
  • @user10974052 我猜你使用的是tidyr::extract,以防它被另一个同名函数(来自magrittr)屏蔽,明确指定NightShifts %&gt;% tidyr::extract(time, into =
猜你喜欢
  • 1970-01-01
  • 2012-06-25
  • 2013-07-29
  • 1970-01-01
  • 2016-05-09
  • 2018-07-14
  • 1970-01-01
  • 2023-01-10
  • 2017-09-11
相关资源
最近更新 更多