我有一个将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子句似乎才会被执行。
答案 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)
但是,它会慢一些。