我使用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
管道的值。
由于
答案 0 :(得分:1)
这是因为您的第一个代码段返回data.frame
,第二个代码段返回tibble
。 tibble
与data.frame
类似,但一个主要区别是子集。如果您有data.frame
,foo[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()