首页 > 解决方案 > 有没有办法在 R 中处理一个混乱的变量?

问题描述

我有以下数据集。我正在尝试使 pivot_wider 使每个 tmc_code 成为一列,并且值来自速度。然后滞后并领先一些价值观。但是,如果您查看 tmc_code,这些值很奇怪,我无法更改它们。我想给他们起我能应付的名字。例如,值“119+04117”最好是“tmc119_04117”。我猜 R 不喜欢值或变量中的“+”。如果我需要重述问题,请告诉我。我知道这是一个混乱的问题,但我的数据集真的很混乱。这是我的数据集的示例。

data<- structure(list(tmc_code = c("119P04108", "119P04109", "119+04117",
                                   "119+04106", "119+04110", "119+04113", 
                                  "119+04111", "119P04107", "119+04110", 
                                  "119P04117", "119+04114", "119+04107",
                                   "119+04112" ), 
             measurement_tstamp = c("2020-06-05 20:10:00", "2020-08-26 10:30:00", 
                                    "2020-11-15 18:20:00", "2020-10-16 13:20:00",  
                                    "2020-09-17 00:20:00", "2020-02-09 15:10:00",  
                                    "2020-03-19 09:15:00", "2020-11-05 03:25:00", 
                                    "2020-07-23 22:35:00", "2020-11-25 22:05:00", 
                                    "2020-03-28 07:40:00", "2020-02-14 22:20:00", 
                                    "2020-05-01 16:25:00"), 
speed = c(69, 64, 74.39, 63.37, 61.8, 71.39, 61, 68.4, 74.18, 62.8, 64, 70.98, 
          66.53)), row.names = c(NA, -13L), class = "data.frame")

我的 pivot_wider 代码是

data<- data%>%
  pivot_wider(names_from = tmc_code, values_from = speed)

标签: rpivottidyverse

解决方案


你可以试试下面的代码

reshape(
  data,
  idvar = "measurement_tstamp",
  timevar = "tmc_code",
  direction = "wide"
)

或者

reshape(
  transform(
    data,
    tmc_code = gsub("(\\w{3}).(.*)", "tmc\\1_\\2", tmc_code)
  ),
  idvar = "measurement_tstamp",
  timevar = "tmc_code",
  direction = "wide"
)

或者

reshape(
  transform(
    data,
    tmc_code = paste0("tmc",gsub("\\+","_", tmc_code))
  ),
  idvar = "measurement_tstamp",
  timevar = "tmc_code",
  direction = "wide"
)

或者

data %>%
  mutate(tmc_code = paste0("tmc", gsub("\\+", "_", tmc_code))) %>%
  pivot_wider(names_from = tmc_code, values_from = speed)

推荐阅读