Dplyr可以将 Dataframe 导入表(函数)吗?

vatpfxk5  于 2023-06-19  发布在  其他
关注(0)|答案(3)|浏览(120)

我有一个以下类型的 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)

有没有可能用管子来做这个?

igetnqfo

igetnqfo1#

虽然我也会使用暴露管道,但另一个选择是使用with

library(magrittr)
mtcars %>% 
  with(table(cyl, gear))

需要理解的是,%>%将左手边放置到右手边的相应位置(通常在第一个插槽中)。
因此,mtcars %>% table(.$cyl)转换为table(mtcars, .$cyl),您可以轻松验证:

trace(table, quote(print(list(...))))

# Tracing table(., .$cyl) on entry 
# [[1]]
#                      mpg cyl  disp  hp drat    wt  qsec vs am gear carb
# Mazda RX4           21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
# Mazda RX4 Wag       21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
# Datsun 710          22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
# Hornet 4 Drive      21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
# Hornet Sportabout   18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
# Valiant             18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
# Duster 360          14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4
# Merc 240D           24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
# Merc 230            22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2
# Merc 280            19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4
# Merc 280C           17.8   6 167.6 123 3.92 3.440 18.90  1  0    4    4
# Merc 450SE          16.4   8 275.8 180 3.07 4.070 17.40  0  0    3    3
# Merc 450SL          17.3   8 275.8 180 3.07 3.730 17.60  0  0    3    3
# Merc 450SLC         15.2   8 275.8 180 3.07 3.780 18.00  0  0    3    3
# Cadillac Fleetwood  10.4   8 472.0 205 2.93 5.250 17.98  0  0    3    4
# Lincoln Continental 10.4   8 460.0 215 3.00 5.424 17.82  0  0    3    4
# Chrysler Imperial   14.7   8 440.0 230 3.23 5.345 17.42  0  0    3    4
# Fiat 128            32.4   4  78.7  66 4.08 2.200 19.47  1  1    4    1
# Honda Civic         30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    2
# Toyota Corolla      33.9   4  71.1  65 4.22 1.835 19.90  1  1    4    1
# Toyota Corona       21.5   4 120.1  97 3.70 2.465 20.01  1  0    3    1
# Dodge Challenger    15.5   8 318.0 150 2.76 3.520 16.87  0  0    3    2
# AMC Javelin         15.2   8 304.0 150 3.15 3.435 17.30  0  0    3    2
# Camaro Z28          13.3   8 350.0 245 3.73 3.840 15.41  0  0    3    4
# Pontiac Firebird    19.2   8 400.0 175 3.08 3.845 17.05  0  0    3    2
# Fiat X1-9           27.3   4  79.0  66 4.08 1.935 18.90  1  1    4    1
# Porsche 914-2       26.0   4 120.3  91 4.43 2.140 16.70  0  1    5    2
# Lotus Europa        30.4   4  95.1 113 3.77 1.513 16.90  1  1    5    2
# Ford Pantera L      15.8   8 351.0 264 4.22 3.170 14.50  0  1    5    4
# Ferrari Dino        19.7   6 145.0 175 3.62 2.770 15.50  0  1    5    6
# Maserati Bora       15.0   8 301.0 335 3.54 3.570 14.60  0  1    5    8
# Volvo 142E          21.4   4 121.0 109 4.11 2.780 18.60  1  1    4    2
# 
# [[2]]
#  [1] 6 6 4 6 8 6 8 4 4 6 6 8 8 8 8 8 8 4 4 4 4 8 8 8 8 4 4 4 8 6 8 4
# 
# Error in xtfrm.data.frame(x) : 
#   (converted from warning) cannot xtfrm data frames

也就是说,从技术上讲,术语.$cyl是可以理解和正确评估的,但是tidyverse并不像它对单个点那样识别它(即在此位置使用LHS,而在第一个位置使用而不是

f <- function(a, b) print(list(a = a, b = b))

2 %>% f("a")
# $a
# [1] 2

# $b
# [1] "a"

# 2 %>% f("a", .)
# $a
# [1] "a"

# $b
# [1] 2

在第二种情况下,tidyverse识别.的存在,因此不会再次将其添加为第一个参数。

更新

恕我直言,最干净的方法是用花括号包围RHS,就像这样,它覆盖了将点放在第一个插槽中的默认行为:

mtcars %>% 
  { table(.$cyl, .$gear) }
zbdgwd5y

zbdgwd5y2#

您可以使用暴露管道%$%将列用作参数,而不使用data参数。

library(magrittr)
mtcars %$% 
  table(cyl, gear)

#    gear
# cyl  3  4  5
#   4  1  8  2
#   6  2  4  1
#   8 12  0  2
jjhzyzn0

jjhzyzn03#

嵌套dot时,lhs仍放在第一位。这可以通过{}来避免。
有关其他备选方案,请参见What are the differences and use cases of the five Magrittr Pipes %>%, %<>%, %$%, %!>% and %T>%?

library(magrittr)
mtcars %>% 
  {table(.$cyl)}
#
# 4  6  8 
#11  7 14

相关问题