我有一个以下类型的 Dataframe :
Date X1 ....
2010-01-01 4
2010-01-02 5
2010-01-27 4
2012-03-10 2
...
所以我使用table()
函数来查看每天/每月的采样频率。这意味着我不会查看每个采样的值,只有当天有一个。问题是,我使用“hydroTSM”包生成了一个名为“season”的附加列。所以我的想法是使用以下代码:
df %>%
filter(date >= "2010-01-01") %>%
filter(date <= "2010-12-30") %>%
table(.$season)
但它给了我错误。
Error in xtrm.data.frame(x) :cannot xtfrm data frames.
然而,如果我将它保存为“日期”变量,然后执行“table(date$season)
”,我就得到了我想要的。
data <- df %>%
filter(date >= "2010-01-01") %>%
filter(date <= "2010-12-30") %>%
as.data.frame(df$date, df$season)
table(data$season)
有没有可能用管子来做这个?
3条答案
按热度按时间igetnqfo1#
虽然我也会使用暴露管道,但另一个选择是使用
with
。需要理解的是,
%>%
将左手边放置到右手边的相应位置(通常在第一个插槽中)。因此,
mtcars %>% table(.$cyl)
转换为table(mtcars, .$cyl)
,您可以轻松验证:也就是说,从技术上讲,术语
.$cyl
是可以理解和正确评估的,但是tidyverse
并不像它对单个点那样识别它(即在此位置使用LHS,而在第一个位置使用而不是:在第二种情况下,tidyverse识别
.
的存在,因此不会再次将其添加为第一个参数。更新
恕我直言,最干净的方法是用花括号包围RHS,就像这样,它覆盖了将点放在第一个插槽中的默认行为:
zbdgwd5y2#
您可以使用暴露管道
%$%
将列用作参数,而不使用data
参数。jjhzyzn03#
嵌套dot时,lhs仍放在第一位。这可以通过{}来避免。
有关其他备选方案,请参见What are the differences and use cases of the five Magrittr Pipes %>%, %<>%, %$%, %!>% and %T>%?。