【问题标题】:Change value based on an "if then" statement in r根据 r 中的“if then”语句更改值
【发布时间】:2021-10-23 22:28:37
【问题描述】:

我有一个这样设置的数据集:

id color
a blue
a blue
a blue
a blue
b green
b green

我想根据 id 条目的数量重命名颜色。例如,如果 n > 3,则为粉红色。我希望输出看起来像这样:

id color
a pink
a pink
a pink
a pink
b green
b green

如果您愿意的话,我主要使用“现成的”代码,并且刚刚开始尝试编写自己的代码来完成任务,尽管相当不成功。这是我尝试编写的代码,但是,它不起作用:

df <- df %>% group_by(id) %>% if(n() > 3){print("pink")}

如果它是相关的,颜色是一个因素。

【问题讨论】:

    标签: r


    【解决方案1】:

    你可以使用

    library(dplyr)
    
    df %>% 
      group_by(id) %>% 
      mutate(color = ifelse(n() > 3, "pink", color)) %>%
      ungroup()
    

    返回

    # A tibble: 6 x 2
      id    color
      <chr> <chr>
    1 a     pink 
    2 a     pink 
    3 a     pink 
    4 a     pink 
    5 b     green
    6 b     green
    

    如果要根据计数添加更多颜色,请改用case_when

    df %>% 
      group_by(id) %>% 
      mutate(color = case_when(n() > 1 & n() <= 3 ~ "brown",
                               n() > 3 ~ "pink",
                               TRUE ~ color)) %>%
      ungroup()
    

    【讨论】:

    • 此代码在应用于示例时有效,但当我将其应用于我自己的数据集时,我收到以下错误消息:错误:mutate()color 出现问题。我color= ifelse(n() &gt;3, "pink", color)。 x color 必须返回跨组的兼容向量 i 第 1 组的结果类型(颜色 = 蓝色):。 i 第 2 组的结果类型(颜色 = 绿色):。我不明白这个消息。颜色列是一个因素。
    • @Chullah 因子实际上是一个刚刚重新标记的整数向量。 “粉红色”是一种新颜色还是已经存在的颜色?
    • 这将是新的。
    【解决方案2】:

    我们可以在mutate 中使用if/else

    library(dplyr)
    df %>%
        group_by(id) %>%
        mutate(color = if(n() > 3) "pink" else color) %>%
        ungroup
    

    -输出

    # A tibble: 6 × 2
      id    color
      <chr> <chr>
    1 a     pink 
    2 a     pink 
    3 a     pink 
    4 a     pink 
    5 b     green
    6 b     green
    

    或使用base R

    df$color[with(df, id %in% names(which(table(id) > 3)))] <- "pink"
    

    数据

    df <- structure(list(id = c("a", "a", "a", "a", "b", "b"), color = c("blue", 
    "blue", "blue", "blue", "green", "green")), 
    class = "data.frame", row.names = c(NA, 
    -6L))
    

    【讨论】:

      猜你喜欢
      • 2023-04-09
      • 2021-03-20
      • 2017-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多