剪切功能在dplyr中不起作用,但在

时间:2015-12-26 21:39:16

标签: r dplyr

我的cut函数在dplyr之外正常工作,但当我将cut函数插入mutate时会抛出此错误:

  

错误:无效的下标类型' double'

示例代码:

df <- structure(list(fyear = c(1970, 1970, 1970, 1970, 1970, 1970, 
1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 
1970, 1970, 1970), BEME = c(0.39713747645951, 0.548988782444936, 
0.537154930871343, 1.89357008340059, 1.66945262543448, 0.969181836638018, 
1.09989952916609, 0.858308443214104, 0.292175536881419, 0.684685677549708, 
0.338422675433708, 3.02671555788371, 0.422643864469658, 0.805317430736738, 
0.529954031556715, 0.617716486520065, 0.911576593365635, 0.4131850675139, 
1.16211278792693, 2.13177678851802), exchg = c(11L, 11L, 11L, 
11L, 11L, 11L, 11L, 11L, 12L, 12L, 12L, 11L, 11L, 12L, 11L, 12L, 
19L, 11L, 11L, 11L)), .Names = c("fyear", "BEME", "exchg"), class = c("tbl_df", 
"data.frame"), row.names = c(NA, -20L))

cut功能

cut(df$BEME, breaks = quantile(df[df$exchg == 11, 2]$BEME, c(0,0.3,0.7,1)), labels = FALSE)

[1] NA  2  2  3  3  2  2  2 NA  2 NA  3  1  2  1  2  2  1  2  3

dplyr

newdat <- df %>% 
  group_by(fyear) %>% 
  mutate(LMH = cut(BEME, breaks = quantile(df[df$exchg == 11, 2]$BEME, c(0,0.3,0.7,1)), labels = FALSE))

1 个答案:

答案 0 :(得分:1)

试试这个

newdat <- df %>% 
  group_by(fyear) %>% 
  mutate(LMH = cut(BEME, breaks = quantile(BEME[exchg == 11], c(0,0.3,0.7,1)), labels = FALSE))

<强>更新

dplyr文档可能比我更好地解释这个,但这是我的评论。

自&#34; BEME&#34;和&#34; exch&#34;是&#34; df&#34;的一部分,它们在调用&#34; mutate&#34;时可用,不需要引用oringinal data.frame(如&#34; df $ BEME& #34;等)。由于调用&#34; group_by&#34;,首先在链中,&#34; mutate&#34;将按组处理数据(dplyr知道如何将子集&#34; BEME&#34;&#34; exch&#34;分组,并且将为每个组调用cut)。我知道这个例子中只有一个组,但是如果有多个组,那么&#34; df $ BEME&#34;和&#34; df $ exch&#34; (在原始代码中使用)将始终引用所有组中的数据,即使按组处理数据子集也是如此。

例如,如果你有&#34; df&#34;如下,有两组(1970年和2000年)

> df
   fyear      BEME exchg
   (dbl)     (dbl) (int)
1   1970 0.3971375    11
2   1970 0.5489888    11
3   1970 0.5371549    11
4   2000 1.8935701    11
5   2000 1.6694526    11

&#34; DF $ BEME&#34;始终引用该列中的所有数据,跨组。

> df$BEME
[1] 0.3971375 0.5489888 0.5371549 1.8935701 1.6694526

所以在

> df %>%
  group_by(fyear) %>%
  mutate(LMH = cut(BEME, breaks = quantile(BEME[exchg == 11], c(0,0.3,0.7,1)), labels = FALSE))

新专栏&#34; LMH&#34;将通过分别处理1970和2000组来创建。使用&#34; df $ BEME&#34; (或&#34; df $ exchg&#34;)总是引用所有组中的所有数据(即df $ BEME有5行)。

至于为什么原始代码在只有一个群体的情况下不起作用,我不知道,我会推荐给更了解dplyr内部工作原理的其他人。