【问题标题】:How can I test for inequality for factors for an unequal number of levels?如何测试不相等数量级别的因子的不等式?
【发布时间】:2017-08-10 11:40:34
【问题描述】:

例如,假设您要计算 80 个残基肽段中的所有相同残基,当残基出现在另一个肽段的相同位置时,就会发生匹配。但问题是级别的数量可能不一样,因为一些代表肽的字母 [A - Z] 将出现在一个肽中,但不会出现在下一个肽中。为简单起见,假设我们正在所有三个肽段中寻找完全相同的残基(字母在这些相同位置匹配),因此答案是 BOOLEAN TRUE 或 FALSE 语句,其中 TRUE 是如果它们都匹配,FALSE 是如果它们不符合。同样的问题是因素的数量不一样,所以你不能测试peptide_x ==peptide_y。

编码:

> peptide_x <- as.factor(sample(LETTERS[1:26], replace = TRUE, 80))
> peptide_y <- as.factor(sample(LETTERS[1:26], replace = TRUE, 80))
> peptide_z <- as.factor(sample(LETTERS[1:26], replace = TRUE, 80))

您可以使用以下命令检查肽中缺少 26 个残基的字母表中的哪些字母:

> setdiff(LETTERS[1:26], peptide_x)

[1]“是”

所以我们看到“Y”(酪氨酸)缺失。当您创建随机肽段时,您可能会遗漏一两个字母,您可以对任何肽段执行此操作。

如果我尝试比较具有相同水平的因素,那么这是可行的:

> x <- c("M", "N", "A", "Q", "C")
> y <- c("N", "M", "A", "C", "Q") 
> xy_frame <- data.frame(x,y)
> xy_frame
> x == y

[1] FALSE FALSE TRUE FALSE FALSE 如您所见,A 匹配,所以第三个元素“A”是唯一的事实。

令人震惊的是,这个测试有效:

> x <- c("A", "A", "B", "Q", "C")
> y <- c("A", "Q", "C", "D", "R")
> x == y
[1]  TRUE FALSE FALSE FALSE FALSE

即使因素的数量不一样。所以我想知道我的数据类型是否有问题,这就是我无法测试的原因:

> peptides <- data.frame(peptide_x, peptide_y)
> peptides$peptide_x == peptides$peptide_y

Ops.factor(peptides$peptide_x,peptides$peptide_y) 中的错误: 水平组的因素是不同的

那么,如果这是问题所在,我该如何修复我的数据类型,或者我是否正在运行正确的测试?

我只想计算 TRUE - FALSE 来表示不同的因子水平。

评论:

%in% 是否无法正常工作,因为...

头部(肽_x) [1] "C" "T" "X" "Z" "M" "A"

头部(肽_y) [1] “R” “G” “T” “U” “G” “U”

头(肽_x %in% 肽_y) [1] 对对对对对对对对对对对对对对

例如,每个肽段的前 6 个字母不匹配,但它显示的是 TRUE!如何?

【问题讨论】:

    标签: r


    【解决方案1】:

    让所有关卡都存在,即使它们不存在

    x <- factor(sample(LETTERS[1:26], replace = TRUE, 80), levels = LETTERS) 
    y <- factor(sample(LETTERS[1:26], replace = TRUE, 80), levels = LETTERS) 
    z <- factor(sample(LETTERS[1:26], replace = TRUE, 80), levels = LETTERS)
    

    注意我如何将每个向量中的levels 设置为相同,即使有些向量不存在也可以

    > x==y
     [1] FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
    [14] FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE
    [27] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
    [40] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
    [53]  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
    [66] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE
    [79] FALSE FALSE
    > x==z
     [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
    [14] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
    [27] FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE
    [40] FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE
    [53] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
    [66] FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
    [79] FALSE FALSE
    > y==z
     [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE  TRUE  TRUE FALSE
    [14] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE
    [27] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
    [40] FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE
    [53] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
    [66] FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
    [79] FALSE FALSE
    

    或者,您可以将它们转换为字符并进行比较

    【讨论】:

    • 谢谢,这看起来很合乎逻辑。我很感激!
    【解决方案2】:

    参考此代码:

    x <- c("A", "A", "B", "Q", "C")
    y <- c("A", "Q", "C", "D", "R")
    R> x == y
    [1]  TRUE FALSE FALSE FALSE FALSE
    

    这是因为您将字符向量 x 与字符向量 y 进行比较。我会跳过这些因素并使用%in% 运算符进行类似的测试:

    R> peptide_x <- sample(LETTERS[1:26], replace = TRUE, 80)
    R> peptide_y <- sample(LETTERS[1:26], replace = TRUE, 80)
    
    R> peptide_x %in% peptide_y
     [1]  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE
    [20]  TRUE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE
    [39]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
    [58]  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE
    [77]  TRUE  TRUE  TRUE FALSE
    

    【讨论】:

    • 哇!太感谢了!这很聪明!
    • FWIW,我经常发现因素真的很棘手,只有在绘制不同级别时才有用。如果可能的话,我会建议远离他们。
    • %in% 是否不能正常工作,因为 ... > head(peptide_x) [1] "C" "T" "X" "Z" "M" "A" > head(peptide_y ) [1] "R" "G" "T" "U" "G" "U" > head(peptide_x %in% peptide_y) [1] TRUE TRUE TRUE TRUE TRUE TRUE 每个肽段的前 6 个字母,例如,不匹配,但它说的是 TRUE!
    猜你喜欢
    • 2016-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 2021-08-03
    • 2010-09-05
    相关资源
    最近更新 更多