在dplyr管道命令中应用函数

时间:2018-11-19 15:27:32

标签: r dplyr

我正在尝试使用Trim包将DescTools包中的dplyr函数应用于R中的数据帧。

到目前为止,我的工作是:

x <- df %>%
  group_by(Country) %>%
  mutate_all(OfferPrice, Trim(trim = 0.1, na.rm = TRUE))

哪个返回以下错误:

Error in Trim(trim = 0.1, na.rm = TRUE) : 
  argument "x" is missing, with no default

我知道Trim()的{​​{1}}部分内部的特性存在问题,但是我似乎无法在mutate内部应用此功能。

该功能可修剪观测值的前10%和后10%,希望删除所有极值。

数据:

dplyr

2 个答案:

答案 0 :(得分:1)

我认为您需要使用do来执行此操作,因为Trim的操作本质上是返回观察值的子集。试试:

x <- df %>%
  group_by(Country) %>% 
  do(
    Trim(.$OfferPrice, trim = 0.1, na.rm = TRUE)
  )

然后可以在lapply语句中使用mapdoTrim的每一列数据,但是我不确定这是否是您真正想要的。尚不清楚,因为您尚未提供任何示例数据。尝试使用mutate_all表示您希望分别Trim的每一列数据,但这对我来说没有意义。

编辑,根据您的评论,您确实希望filter医学列Trim OfferPrice的数据框,所以

x <- df %>%
  group_by(Country) %>% 
  do(
    .[attr(Trim(.$OfferPrice, trim = 0.1, na.rm = TRUE), "trim"), ]
  )

有关详细信息,请参见Trim的文档

  

调整后的值的索引将作为名为“ trim”的属性附加。

答案 1 :(得分:1)

假设您要为OfferPrice排除的Trim(OfferPrice, ...)的任何元素删除df的整个行,获取结果的trim属性Trim(...)中的行,并使用slice通过Country删除那些行。

library(dplyr)
library(DescTools)

df %>%
  group_by(Country) %>%
  slice(-attr(Trim(OfferPrice, trim = 0.1, na.rm = TRUE), "trim")) %>%
  ungroup

这也可以写成:

df %>%
  group_by(Country) %>%
  slice(OfferPrice %>% 
          Trim(trim = 0.1, na.rm = TRUE) %>% 
          attr("trim") %>% 
          `-`) %>%
  ungroup