将1x1数据帧转换为值

时间:2018-02-04 20:03:43

标签: 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]

运行此代码时,foo会根据需要变为等于2018-02-04的值。但是,当我使用slice未注释的代码运行代码时:

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

foo <- foo[1,1]

foo保留为数据框。我的主要问题是为什么foo在第二个例子中不会成为一个值,而我的第二个问题是,如果有一个简单的方法可以获得&#34; 2018-02-04&#34 ;作为foo存储为dplyr管道的值。

由于

1 个答案:

答案 0 :(得分:1)

这是因为您的第一个代码段返回data.frame,第二个代码段返回tibbletibbledata.frame类似,但一个主要区别是子集。如果您有data.framefoo[1, 1]会将第一列的第一行作为向量返回,而如果您有tibble,则会将第一列的第一行作为{{1}返回1}}。

tibble

返回

df %>% 
  arrange(desc(Day)) %>% 
  mutate(DayPlus = as.Date(Day) + 1) %>% 
  select(DayPlus) %>%
  class()

而第二个

[1] "data.frame"

返回

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