R语言 日期变量列前面的“-”有什么用?

4dbbbstv  于 2023-02-17  发布在  其他
关注(0)|答案(1)|浏览(174)

问题

为什么下面的两个代码返回不同的结果,或者这个代码中“date”变量列前面的“-”有什么用?

bikes <- read_csv("https://raw.githubusercontent.com/whipson/Ottawa_Bicycles/master/bikes_app.csv", col_types = c("?nnnnnnnnnnnnnn"))
coords <- read_csv("https://raw.githubusercontent.com/whipson/Ottawa_Bicycles/master/coords.csv")

下面的代码在date变量前有没有“-”的结果是不同的,所以我想知道在代码中“date”前使用“-”的方法是什么?

bikes_plot <- bikes %>%
  pivot_longer(names_to = "counter", values_to = "count", -date) %>%
  left_join(coords, by = "counter")

bikes_plot <- bikes %>%
  pivot_longer(names_to = "counter", values_to = "count", date) %>%
  left_join(coords, by = "counter")

我很困惑为什么R控制台中的代码的两个结果是不同的?
pivot_longer(names_to = "counter", values_to = "count", -date)中,如果"values_to = "count",count是csv文件中的现有列名,或者它是一个摘要,我也会感到害怕。

f0brbegy

f0brbegy1#

在R中,当你命名参数时,它们总是被赋给形式定义中的相应名称;当参数没有被命名时,它们在arg列表中(...之前)从左到右填充那些没有被赋给命名参数的参数。
如果你看一下pivot_longer的参数:

pivot_longer(
       data,
       cols,
       names_to = "name",
       names_prefix = NULL,
       names_sep = NULL,
       names_pattern = NULL,
       names_ptypes = NULL,
       names_transform = NULL,
       names_repair = "check_unique",
       values_to = "value",
       values_drop_na = FALSE,
       values_ptypes = NULL,
       values_transform = NULL,
       ...
     )

接听您的电话:

bikes %>%
  pivot_longer(names_to = "counter", values_to = "count", -date)

%>%管道中的“当前数据”被赋给第一个参数,即data。下一个未命名的参数-date(或另一个块中的date)被赋给cols,即

cols: <'tidy-select'> Columns to pivot into longer format.

前导-的出现意味着“除date之外的所有列“,以整齐选择的方式选择列。其他选项可以是everything()ends_with("bar")等。
当您说-date时,您是说您希望date列保持不变:它仍然是一列,在这种情况下,您将把所有剩余的列旋转/调整为两列:一列"count"保存其他值,"counter"包含从中检索count的列名。因为我们选择了除一列之外的所有列进行透视(并且我们没有执行任何其他花哨的按模式透视),所以我们应该看到生成的(ncol(bikes)-1) * nrow(bikes)行。

bikes %>%
  pivot_longer(names_to = "counter", values_to = "count", -date)
# # A tibble: 49,840 × 3
#    date                counter          count
#    <dttm>              <chr>            <dbl>
#  1 2010-01-01 00:00:00 alexandra_bridge     0
#  2 2010-01-01 00:00:00 eastern_canal        0
#  3 2010-01-01 00:00:00 ottawa_river         0
#  4 2010-01-01 00:00:00 western_canal       NA
#  5 2010-01-01 00:00:00 laurier_bay         NA
#  6 2010-01-01 00:00:00 laurier_lyon        NA
#  7 2010-01-01 00:00:00 laurier_metcalfe    NA
#  8 2010-01-01 00:00:00 somerset_bridge     NA
#  9 2010-01-01 00:00:00 otrain_young        NA
# 10 2010-01-01 00:00:00 otrain_gladstone    NA
# # … with 49,830 more rows
# # ℹ Use `print(n = ...)` to see more rows

当您改为使用date时(而不是-date),您是说"仅“透视该列...这似乎有点愚蠢,因为它所做的全部工作是删除date列,添加一个名为"counter"的列,该列始终包含"date"(透视列的名称),以及一个名为"count"的列,该列有效地(在本例中)与原始date列完全相同。其余列不被触及,并且由于我们旋转的列数仅为1,所以帧中的行数不变。

相关问题