将 1x1 数据帧转化为值

Coo*_*Day 5 r dplyr

我正在用来dplyr转换大型数据框,并且我想将 DF 的最新日期 + 1 存储为值。我知道有更简单的方法可以通过分解语句来做到这一点,但我试图用一个管道语句来完成这一切。我遇到了一些问题,但我不确定为什么 R 会这样默认。例子:

Day <- seq.Date(as.Date('2017-12-01'), as.Date('2018-02-03'), 'day')
Day <- sample(Day, length(Day))
ID <- sample(c(1:5), length(Day), replace = T)

df <- data.frame(ID, Day)

foo <- df %>% 
  arrange(desc(Day)) %>% 
  mutate(DayPlus = as.Date(Day) + 1) %>% 
  select(DayPlus) #%>% 
  #slice(1)

foo <- foo[1,1]
Run Code Online (Sandbox Code Playgroud)

当我运行此代码时,变为等于所需的foo值。2018-02-04但是,当我运行未注释的代码时slice

foo <- df %>% 
  arrange(desc(Day)) %>% 
  mutate(DayPlus = as.Date(Day) + 1) %>% 
  select(DayPlus) %>% 
  slice(1)

foo <- foo[1,1]
Run Code Online (Sandbox Code Playgroud)

foo保留为数据框。我的主要问题是为什么foo没有成为第二个示例中的值,我的第二个问题是是否有一种简单的方法可以将“2018-02-04”作为foo从一个dplyr管道全部存储的值。

谢谢

cle*_*ens 2

那是因为您的第一个片段返回 a data.frame,第二个片段返回 a tibbletibbles 与 s 类似data.frame,但一个主要区别是子集化。如果您有 a data.framefoo[1, 1]则将第一列的第一行作为向量返回,而如果您有 a tibble,则将第一列的第一行作为 a 返回tibble

df %>% 
  arrange(desc(Day)) %>% 
  mutate(DayPlus = as.Date(Day) + 1) %>% 
  select(DayPlus) %>%
  class()
Run Code Online (Sandbox Code Playgroud)

回报

[1] "data.frame"
Run Code Online (Sandbox Code Playgroud)

而第二个

df %>% 
  arrange(desc(Day)) %>% 
  mutate(DayPlus = as.Date(Day) + 1) %>% 
  select(DayPlus) %>% 
  slice(1) %>%
  class()
Run Code Online (Sandbox Code Playgroud)

回报

[1] "tbl_df"     "tbl"        "data.frame"
Run Code Online (Sandbox Code Playgroud)