【问题标题】:cut function not working in dplyr, but works outsidecut 函数在 dplyr 中不起作用,但在外部起作用
【发布时间】:2016-04-01 05:40:18
【问题描述】:

我的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))

【问题讨论】:

    标签: r dplyr


    【解决方案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 文档可能比我更好地解释了这一点,但这里是我的 cmets。

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

    例如,如果你有如下的“df”,有两个组(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
    

    "df$BEME" 始终引用该列中的所有数据,跨组。

    > 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))
    

    将通过分别处理 1970 和 2000 组来创建新列“LMH”。使用“df$BEME”(或“df$exchg”)总是指所有组中的所有数据(即 df$BEME 有 5 行)。

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

    【讨论】:

    • 或许也为我们这些简单的人添加一些解释。
    • 在最后 3 个问题上,您和 Op 似乎真的在同一个波长上。哇:P
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多