【问题标题】:Checking if all factors within a factor are unique, then if so, returning that factor. If not, returning a third value. R检查一个因子中的所有因子是否都是唯一的,如果是,则返回该因子。如果不是,则返回第三个值。 R
【发布时间】:2020-11-18 15:46:49
【问题描述】:

第一次在这里发帖!已经为此苦苦挣扎了大约两天,但我有一个看起来像这样的数据框:

code.1 <- factor(c(rep("x",3), rep("y",2), rep("z",3)))
type.1 <- factor(c(rep("small", 2), rep("medium", 2), rep("large", 4)))
df <- cbind.data.frame(type.1, code.1)
df

我正试图让它返回这个:

code.2 <- factor(c("x", "y", "z"))
type.2 <- factor(c("multiple", "multiple", "large"))
df2 <- cbind.data.frame(type.2, code.2)
df2

我已经尝试了各种方式的 If/Else 并应用按“代码”分组的函数来返回这些结果,但被卡住了。任何帮助表示赞赏!

【问题讨论】:

    标签: r if-statement dplyr factors


    【解决方案1】:

    你可以用dplyr做到这一点:你按code.1分组,然后你所要做的就是用if/else总结type.1:如果只有一个值,你返回它,否则你返回“多个”。

    由于实际考虑,代码稍微复杂一些(需要转换为字符,需要有一个向量化的 TRUE 条件,即使为 FALSE 也始终返回单个值):

    
    df %>%
      group_by(code.1) %>%
      summarize(type.2 = if_else(n_distinct(type.1) == 1,
                                 as.character(first(type.1)),
                                 "multiple"),
                type.2 = as.factor(type.2))
    # A tibble: 3 x 2
    #   code.1 type.2  
    #   <fct>  <fct>   
    # 1 x      multiple
    # 2 y      multiple
    # 3 z      large   
    

    编辑:这是相同方法的不同表述,但不转换为字符,可能更适合大型问题,并且可能对同一问题给出不同的看法:

    # default value when multiple
    iffalse <- as.factor("multiple")
    
    df %>%
      group_by(code.1) %>%
      mutate(type.1 = factor(type.1, levels = c(levels(type.1), levels(iffalse)))) %>% # add possible level to type.1
      summarize(type.2 = if_else(n_distinct(type.1) == 1,
                                 first(type.1),
                                 iffalse))
    

    【讨论】:

    • 这非常有效。我非常感谢您的帮助@Alexlok!
    • @GregorThomas 我不认为它在这里工作:例如y 有两个单独的值,所以没有重复,但我们想把它算作“多个”;而对于z,我们有一个重复3次的值,所以我们保留这个。我们需要一个函数“allDuplicated”(但它们都是相同的重复项)。除此之外,由于unique()也是C语言,如果我们设法摆脱它,我们是否期望获得如此大的收益?
    • 啊,你是对的。认为我没有很好地理解这个问题。
    • 但是,基于此,我认为您可以将dplyr::n_distinct 用作nb_values 的插件以避免自定义函数:)
    • 确实,我找不到那个功能!我更新了我的答案。
    猜你喜欢
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 2020-12-06
    • 2020-08-20
    • 2021-04-02
    • 1970-01-01
    • 2019-06-24
    相关资源
    最近更新 更多