gpt4 book ai didi

r - 串联字符串中的自定义因子水平

转载 作者:行者123 更新时间:2023-12-04 09:36:30 25 4
gpt4 key购买 nike

我有一个因子变量,它由两个由 _ 分隔的子字符串组成。 , 喜欢 string1_string2 .我想分别设置前缀(“string1”)和后缀(“string2”)的因子级别,然后为连接的字符串定义一组整体的因子级别。此外,第一个和第二个子串中级别的优先级可能会有所不同。

我想要实现的一个小例子:

# reproducible data

x <- factor(c("DBO_A", "PH_A", "COND_A", "DBO_B", "PH_B", "COND_B", "DBO_C", "PH_C", "COND_C"))

[1] DBO_A PH_A COND_A DBO_B PH_B COND_B DBO_C PH_C COND_C
Levels: COND_A COND_B COND_C DBO_A DBO_B DBO_C PH_A PH_B PH_C

如果我不定义因子水平,它们将按字母顺序排列。现在我想设置 _左右两侧的字符串的级别。分隔符,例如
  • PH < COND < DBO 在左侧 (LHS)。
  • B < A < C 在右侧 (RHS)。

  • 另外,我想指定哪一边,LHS 或 RHS,比另一边有优先权。根据哪一方有优先权,级别的整体顺序会有所不同:

    (1) 如果 LHS 上的水平是先例:
    [1] DBO_A  PH_A   COND_A DBO_B  PH_B   COND_B DBO_C  PH_C   COND_C
    Levels: PH_B PH_A PH_C COND_B COND_A COND_C DBO_B DBO_A DBO_C

    (2) 如果 RHS 上的级别是先例:
    [1] DBO_A  PH_A   COND_A DBO_B  PH_B   COND_B DBO_C  PH_C   COND_C
    Levels: PH_B COND_B DBO_B PH_A COND_A DBO_A PH_C COND_C DBO_C

    现在我只有一个想法来解决它,例如 factor(x, levels = c(xx, xx, ...)) ,但我的关卡比上面显示的多,所以这看起来很可笑。

    注:我不想更改数据的顺序,只想更改级别的顺序。

    最佳答案

    我们可以使用 base R去做这个。使用 sub删除 levels 中的子字符串向量,与 match通过检查自定义顺序中的那些值来创建数字索引,重新分配 levelsfactor来自 order输入 levels 的序列的矢量基于 match索引

    i1 <- match(sub("_.*", "", levels(x)), c("PH", "COND", "DBO"))
    i2 <- match(sub(".*_", "", levels(x)), c("B", "A", "C"))
    factor(x, levels = levels(x)[seq_along(levels(x))[order(i1, i2)]])

    对于第二种情况,只需反转 order 中的索引即可
    factor(x, levels = levels(x)[seq_along(levels(x))[order(i2, i1)]])

    重复使用,可以包裹在一个函数中
    f1 <- function(vec, lvls1, lvls2, flag = "former") {
    i1 <- match(sub("_.*", "", levels(vec)), lvls1)
    i2 <- match(sub(".*_", "", levels(vec)), lvls2)

    if(flag == 'former') {
    factor(vec, levels = levels(vec)[seq_along(levels(vec))[order(i1, i2)]])
    } else {
    factor(vec, levels = levels(vec)[seq_along(levels(vec))[order(i2, i1)]])

    }


    }

    f1(x, c("PH", "COND", "DBO"), c("B", "A", "C"))
    #[1] DBO_A PH_A COND_A DBO_B PH_B COND_B DBO_C PH_C COND_C
    #Levels: PH_B PH_A PH_C COND_B COND_A COND_C DBO_B DBO_A DBO_C


    f1(x, c("PH", "COND", "DBO"), c("B", "A", "C"), flag = "latter")
    #[1] DBO_A PH_A COND_A DBO_B PH_B COND_B DBO_C PH_C COND_C
    #Levels: PH_B COND_B DBO_B PH_A COND_A DBO_A PH_C COND_C DBO_C

    关于r - 串联字符串中的自定义因子水平,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54064503/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com