【问题标题】:Recoding dataframe by transformation table通过转换表重新编码数据帧
【发布时间】:2015-08-21 04:46:07
【问题描述】:

我有一个包含 3 列的数据框。其中一列(项目)包括可能重复的长字符串(一些包括特殊字符,例如分号;为简单起见,这里写为 Tx)。我想找到特定列的所有唯一值。为每个唯一值创建以下格式的昵称:OV1、OV2、... OVn。我想保留这张表并称之为“转换表”。 在下一步中,我想转到源表并使用转换表中的值重新编码每个值。

以下是源表的示例:

    items  sequenceID        eventID SIZE  
1:   T1      41595370             1    1
2:   T2      41595371             1    1
3:   T3      41595282             1    1
4:   T3      41595282             2    1
5:   T4      41595373             1    1
6:   T5      41595368             1    1
7:   T1      41595379             1    1

结果表将是:

     items     sequenceID      eventID SIZE  
1:   OV1       41595370             1    1
2:   OV2       41595371             1    1
3:   OV3       41595282             1    1
4:   OV3       41595282             2    1
5:   OV4       41595373             1    1
6:   OV5       41595368             1    1
7:   OV1       41595379             1    1

转换表将是:

1:   T1    OV1
2:   T2    OV2
3:   T3    OV3
4:   T4    OV4
5:   T5    OV5

源数据位于data6(数据框)中。 我使用了以下命令:

u1 <- unique(data6$items)
u1 <- data.frame(u1)
ov <- c(paste("ov",1:nrow(u1),sep=""))

我现在将u1 中的所有唯一项列替换为OV 值并将其创建为转换表。之后替换data6$items中的所有值。

非常感谢您的帮助。

【问题讨论】:

    标签: r dataframe transformation recode


    【解决方案1】:

    看起来您的“项目”可以被视为需要新标签的因素变量。如果是这样,您可以避免转换表并重新编码源数据框中的“项目”:

    data6$items = factor(data6$items, labels=paste0("OV", 1:length(unique(data6$items))))
    

    【讨论】:

    • 非常感谢。该命令似乎有效。但是,如果我想将 OV(新项目值)更改为以下格式:OV1、OV2 等,我必须在命令中更改什么?此外,我收到以下警告: - 为什么? - 警告消息:在levels&lt;-(*tmp*, value = if (nl == nL) as.character(labels) else paste0(labels, : 不推荐使用重复的因子级别
    • 运行命令后得到以下信息: items sequenceID eventID SIZE 1: OV4CC 41595370 1 1 2: OVFCD 41595371 1 1 3: OV6A6 41595282 1 1 4: OV6A6 41595282 2 1 5: OV49A 4151 1 6:OV990 41595368 1 1
    • 我更改了代码,现在新创建的变量的级别是 OV1..OVn。使用您的数据我没有收到任何警告消息,也许您必须先定义变量 as.character()。
    【解决方案2】:

    您可以使用以下方法创建转换表:

    u1 <- as.data.frame(unique(data6$items))
    names(u1) <- "items"
    u1$newitem <- paste0("OV", substr(u1$items,2,4))
    

    这给出了:

    > u1
      items newitem
    1    T1     OV1
    2    T2     OV2
    3    T3     OV3
    4    T4     OV4
    5    T5     OV5
    

    您现在可以将源表中的相关项目替换为:

    data6$items = u1$newitem[match(data6$items,u1$items)]
    

    这给出了:

    > data6
      items sequenceID eventID SIZE
    1   OV1   41595370       1    1
    2   OV2   41595371       1    1
    3   OV3   41595282       1    1
    4   OV3   41595282       2    1
    5   OV4   41595373       1    1
    6   OV5   41595368       1    1
    7   OV1   41595379       1    1
    

    如果您只想将T 更改为OV,您也可以这样做:

    data6$items <- gsub("T", "OV", data6$items)
    

    【讨论】:

    • 非常感谢。但是如何替换源表中的相关项目值?
    • 谢谢。但是,项目内容并不像我在这里展示的那么简单,它不仅包含 Tx 字母,还包含长字符串,甚至可能包含分号 (;)。我想将每个相同的值更改为 OVx 格式的相同值(即 OV1、OV2 ...),因此如果相同的字符串出现在不同行的项目中,它将获得相同的 OVi。
    • @Avi 您能否在这些长字符串中包含一个有问题的reproducible example 以及您希望它们如何?
    • 当然这里是第一行项目的例子(应该被认为是OV1):BA31C1CC63E5043483FAE25F085E25E5 INSERT 这里是第二行的例子(整个值应该是OV2):9D7F7E3AD871B6393B434427B6B8232C SELECT ;314CD91DCA8849C64DCEACBA2E3B65B7 选择
    • @Avi 请编辑您的问题并在此处包含必要的信息;从那条评论中很难猜出你想要什么
    猜你喜欢
    • 1970-01-01
    • 2017-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-15
    • 2021-11-16
    相关资源
    最近更新 更多