【问题标题】:New column / mutate based on existing column基于现有列的新列/变异
【发布时间】:2020-02-18 22:08:35
【问题描述】:

我想根据现有列的条件向数据框 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

任何建议将不胜感激。

【问题讨论】:

    标签: r if-statement dplyr


    【解决方案1】:

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

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

    如果我们需要避免赋值&lt;,可以使用复合运算符(%&lt;&gt;% from 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 分配给原始数据集中的新列而发生错误

    【讨论】:

    • 非常感谢@akrun。您能否也请建议如何处理 NA?现在,代码将所有内容(小于 8)屏蔽为“低”。
    • @Sadiaz。因此,如果值为 NA,则您的意思是返回 NA
    • 当值为NA时返回NA
    • 完美运行,非常感谢!如果我想提高我的 R 技能,我应该如何练习 - 你能推荐一些东西吗?
    • @Sadiaz 练习只能使用practice :=)。每天至少花 1-2 小时耐心地解决问题。我不能指定一种适用于所有人的单一方法,因为我们都是不同的。对我来说,如果我真的从书中解决问题,或者从课程中解决问题,我会感到无聊。对于其他人来说,它可能会很好用。 SO 是获得即时响应的绝佳平台,如果您是那种不介意受到挑战和嘲讽的人
    猜你喜欢
    • 2019-09-10
    • 2017-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多