【问题标题】:Values extracted from an object are assigned in a different order [duplicate]从对象中提取的值以不同的顺序分配[重复]
【发布时间】:2020-01-13 04:39:32
【问题描述】:

我正在使用一个简单的data.frame 对象,并且只想为其分配一个简单的列,该列是从character 对象中提取的。问题是这些值是按错误的顺序提取的。

我有一个如下所示的数据框:

>df
       Sample                 ID
1         558  Benign_or_BL.FFPE
2         105  Benign_or_BL.FFPE
3          37         Early.FFPE
4          79         Early.FFPE
5         180         Early.FFPE
6         133          Late.FFPE
7         152          Late.FFPE
8         265          Late.FFPE
9         558 Benign_or_BL.Fresh
10        105 Benign_or_BL.Fresh
11        573 Benign_or_BL.Fresh
12        374 Benign_or_BL.Fresh
13        307 Benign_or_BL.Fresh
14        403 Benign_or_BL.Fresh
15         37        Early.Fresh
16         79        Early.Fresh
17        180        Early.Fresh
18        584        Early.Fresh
19        482        Early.Fresh
20        500        Early.Fresh
21        571        Early.Fresh
22        572        Early.Fresh
23        371        Early.Fresh
24        133         Late.Fresh
25        152         Late.Fresh
26        265         Late.Fresh
27         65         Late.Fresh
28        422         Late.Fresh
29        562         Late.Fresh
30        485         Late.Fresh
31        492         Late.Fresh
32        518         Late.Fresh

我想做的只是为df$ID列的每个级别分配一个十六进制颜色代码。

我的第一次尝试是创建一个包含与df$ID 上的级别数相同数量的颜色的对象。这是我所做的:

> levels(as.factor(targetsJ$ID2))
[1] "Benign_or_BL.FFPE" "Benign_or_BL.Fresh" "Early.FFPE" "Early.Fresh" "Late.FFPE"         
[6] "Late.Fresh"

现在,我按照完全相同的顺序创建一个具有我想要的颜色的对象:

> colors <- c("#9b9dff","#5153ff","#0003e0","#f6a5aa","#ee4c55","#c4131d")

现在,添加包含颜色编码的额外列,我得到如下内容:

> df$colcode <- colors[as.factor(targetsJ$ID)]

> head(df, n=10)
       Sample                ID  colcode
1         558  Benign_or_BL.FFPE #9b9dff
2         105  Benign_or_BL.FFPE #9b9dff
3          37         Early.FFPE #0003e0
4          79         Early.FFPE #0003e0
5         180         Early.FFPE #0003e0
6         133          Late.FFPE #ee4c55
7         152          Late.FFPE #ee4c55
8         265          Late.FFPE #ee4c55
9         558 Benign_or_BL.Fresh #5153ff
10        105 Benign_or_BL.Fresh #5153ff

如您所见,颜色代码的顺序与对象 colors 上的不同。

我期待的是这样的:

> head(df, n=10)
       Sample                ID  colcode
1         558  Benign_or_BL.FFPE #9b9dff
2         105  Benign_or_BL.FFPE #9b9dff
3          37         Early.FFPE #5153ff
4          79         Early.FFPE #5153ff
5         180         Early.FFPE #5153ff
6         133          Late.FFPE #0003e0
7         152          Late.FFPE #0003e0
8         265          Late.FFPE #0003e0
9         558 Benign_or_BL.Fresh #f6a5aa
10        105 Benign_or_BL.Fresh #f6a5aa

这里发生了什么? 非常感谢任何帮助。

【问题讨论】:

    标签: r


    【解决方案1】:

    当我们使用factor 时,级别会以排序方式自动分配。见

    temp <- c("a", "c", "d", "b")
    levels(factor(temp))
    #[1] "a" "b" "c" "d"
    

    如果我们想根据它们在数据中的出现来分配级别,我们需要使用unique指定级别

    levels(factor(temp, levels = unique(temp)))
    #[1] "a" "c" "d" "b"
    

    所以在你的情况下,我们这样做

    df$ID <- factor(df$ID, levels = unique(df$ID))
    df$colcode <- colors[df$ID]
    
    
    df
    #   Sample                 ID colcode
    #1     558  Benign_or_BL.FFPE #9b9dff
    #2     105  Benign_or_BL.FFPE #9b9dff
    #3      37         Early.FFPE #5153ff
    #4      79         Early.FFPE #5153ff
    #5     180         Early.FFPE #5153ff
    #6     133          Late.FFPE #0003e0
    #7     152          Late.FFPE #0003e0
    #8     265          Late.FFPE #0003e0
    #9     558 Benign_or_BL.Fresh #f6a5aa
    #10    105 Benign_or_BL.Fresh #f6a5aa
    #....
    

    同样,我们也可以使用match

    df$colcode <- colors[match(df$ID, unique(df$ID))]
    

    【讨论】:

    • 那是相当快的!非常感谢@Ronak Shah!您介意解释一下问题所在吗?
    • @Douglas 刚刚添加了一些解释。
    • 太棒了!非常感谢@Ronak Shah!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-10
    • 1970-01-01
    • 1970-01-01
    • 2016-06-12
    • 2020-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多