dplyr mutate调用结果不正确的函数

时间:2016-08-19 15:01:06

标签: r

我有一个将460K观测值加载到名为data的数据框中的数据集。其中一个变量定义如下:

$ exeroft1  <int> NA, 105, NA, 205, NA, 102, 220, 102, 102, 220, 230, NA, NA, 105, 102, 210, 203, NA, NA, 107, 103, NA, 203, NA, NA, 105, 107, NA, 102, NA, 107, NA, 107, 103, ...

我需要将exeroft1的每个值传递给以下函数,该函数将值转换为另一个值:

calculateWeeklyExercise <- function(value) {
    if (value > 200) {
        timesWeekly = (value - 200) / 4
    } else {
        timesWeekly = (value - 100)
    }

    timesWeekly
}

以下是一些执行所有处理的R代码:

data %>%
    # Filter missing values
    filter(!is.na(exeroft1)) %>% 

    # Add a column to the data frame which represents exercise rate
    mutate(weeklyExercise = calculateWeeklyExercise(exeroft1)) %>%

    # Select some values
    select(educa, sex, exeroft1, weeklyExercise)

当我执行此代码时,我收到以下警告,我不明白:

Warning message:
In if (value > 200) { :
  the condition has length > 1 and only the first element will be used

我对R不太熟悉。似乎我传递给函数的值不被视为整数,即使它是。对于任何值&lt; 200,计算正确的值。对于任何值&gt; 200,不是。所以,基本上,在函数中,只有else子句似乎才会被执行。

1 个答案:

答案 0 :(得分:2)

如果我们修改函数以使用ifelse即。 if/else的矢量化形式可以采用多个值,然后它应该起作用

calculateWeeklyExerciseNew <- function(value) {
  ifelse(value > 200, 
           (value - 200) / 4,
              value - 100)

 }

警告信息很明显,因为OP的功能应用于元素数量大于1的数据集列。由于if/else只接受一次观察,它会抛出警告。即

if(1:3 >2) 1
  

警告消息:在if(1:3> 2)1中:条件的长度为&gt; 1   并且只使用第一个元素

在上面的例子中,我们有一个长度为3(1:3)的向量,它会给出警告,假设我们使用ifelse

ifelse(1:3 >2, 1, 0)
#[1] 0 0 1

但是,我们仍然可以通过执行rowwise来使用OP的功能只进行一次观察,即

data %>%
    filter(!is.na(exeroft1)) %>% 
    rowwise() %>%
    mutate(weeklyExercise = calculateWeeklyExercise(exeroft1)) %>%
    select(educa, sex, exeroft1, weeklyExercise)

但是,它会慢一些。