新列/基于现有列的变异

时间:2019-10-22 17:39:12

标签: r if-statement dplyr

我想根据现有列中的条件将新列添加到数据框df中,例如,

df$TScore = as.factor(0)
df$TScore = 
  if_else(df$test_score >= '8.0', 'high',
      if_else(!is.na(df$test_score), 'low', 'NA'))

我面临的问题是,在某些情况下,TScore是我期望的,即当分数为8或更高时,它是“高”,但在某些情况下,它是不正确的。 上面的代码有错误吗?此数据中有很多NA。

我也在努力使用dplyr()编写它。到目前为止,我已经写了这个:

df$TScore =   df %>%
                filter(test_score >= 8) %>%
                    mutate(TScore = 'high')

但是,正如我们所期望的,尺寸不匹配。给出以下错误:

Error in `$<-.data.frame`(`*tmp*`, appScore, value = list(cluster3 = c(1L,  : replacement has 126 rows, data has 236

任何建议将不胜感激。

1 个答案:

答案 0 :(得分:1)

我们不需要执行filter,可以使用ifelsecase_when

library(dplyr)
df <- df %>%           
          mutate(TScore = case_when(test_score >= 8 ~'high', TRUE ~ "low"))

如果我们需要避免分配<,可以使用复合运算符(%<>%中的magrittr

library(magrittr)
df %<>%
     mutate(TScore = case_when(is.na(test_score) ~ NA_character_, 
                               test_score >= 8 & !is.na(test_score) ~'high', 
                    TRUE ~ "low"))

由于将filtered data.frame分配给原始数据集中的新列而发生错误