【问题标题】:filtering with a variable does not give the same results as with a constant - R使用变量进行过滤不会得到与使用常量相同的结果 - R
【发布时间】:2020-12-02 06:53:11
【问题描述】:

这可能是一件愚蠢的事情,但我有一个 data.frame 并制作了一个过滤器,但我没有使用带有 dplyr::filter 或基本子集的变量作为常量的相同结果,首先是一个示例

tt <- data.frame( t = runif(100,max=100)) %>% mutate(period =trunc( (t+3) / 12))
i <- 0
tt %>% filter(period==0)
tt %>% filter(period==i)
tt[tt$period == i,]

结果是等价的

> tt %>% filter(period==0)
         t period
1 4.047352      0
2 2.391890      0
3 6.050928      0
4 1.646503      0
5 2.335137      0
> tt %>% filter(period==i)
         t period
1 4.047352      0
2 2.391890      0
3 6.050928      0
4 1.646503      0
5 2.335137      0
> tt[tt$period == i,]
          t period
23 4.047352      0
47 2.391890      0
75 6.050928      0
93 1.646503      0
95 2.335137      0

然后真正的(大)data.frame我做了同样的操作,并没有得到等效的结果

patch_sparse <- patch_sparse %>% mutate(period = trunc( (t+3) / 12))
str(patch_sparse)

'data.frame':   768307 obs. of  7 variables:
 $ t     : num  1 1 1 1 1 1 1 1 1 1 ...
 $ i     : int  2864 2864 2864 2864 2876 2876 2875 2876 2875 2857 ...
 $ j     : int  3109 3110 3111 3112 3112 3113 3114 3114 3115 3116 ...
 $ data  : logi  TRUE TRUE TRUE TRUE TRUE TRUE ...
 $ date  : chr  "2000-11-01" "2000-11-01" "2000-11-01" "2000-11-01" ...
 $ region: chr  "Australia" "Australia" "Australia" "Australia" ...
 $ period: num  0 0 0 0 0 0 0 0 0 0 ...

#
i <- 0
patch_sparse %>% filter(period==0) 
patch_sparse %>% filter(period==i) 
patch_sparse[patch_sparse$period == i,]

结果是:

> patch_sparse %>% filter(period==0) 
    t    i    j data       date    region period
1   1 2864 3109 TRUE 2000-11-01 Australia      0
2   1 2864 3110 TRUE 2000-11-01 Australia      0
3   1 2864 3111 TRUE 2000-11-01 Australia      0
...
142 2 3457 1524 TRUE 2000-12-01 Australia      0
 [ reached 'max' / getOption("max.print") -- omitted 2346 rows ]

> patch_sparse %>% filter(period==i) 
[1] t      i      j      data   date   region period
<0 rows> (or 0-length row.names)

> patch_sparse[patch_sparse$period == i,]
    t    i    j data       date    region period
1   1 2864 3109 TRUE 2000-11-01 Australia      0
2   1 2864 3110 TRUE 2000-11-01 Australia      0
3   1 2864 3111 TRUE 2000-11-01 Australia      0
..
142 2 3457 1524 TRUE 2000-12-01 Australia      0
 [ reached 'max' / getOption("max.print") -- omitted 2346 rows ]

我尝试将data.frame 更改为tibble 或将trunc() 更改为as.integer(),结果相似,但我无法获得可重现的示例。有什么想法吗?

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    问题是您的数据包含第 i 列。在 tidyverse 管道中,函数将始终首先在数据中查找,因此您实际上尝试对 patch_sparse %&gt;% filter(period==i) 执行的操作是过滤 period 等于 列 i 的数据。

    因此,如果您想根据外部标量进行过滤,请确保标量的名称与数据的列名称不同,例如类似:

    filter_i <- 0
    patch_sparse %>% filter(period==filter_i)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多