【问题标题】:Replacing numbers in a list whilst retaining letters in R替换列表中的数字,同时保留 R 中的字母
【发布时间】:2020-10-12 13:40:56
【问题描述】:

我正在尝试重新组织 XML 文件中的一些数据,我在其中删除列表中的所有其他节点,即

        <TIME_SLOT TIME_SLOT_ID="ts1" TIME_VALUE="0"/>
        <TIME_SLOT TIME_SLOT_ID="ts2" TIME_VALUE="2900"/>
        <TIME_SLOT TIME_SLOT_ID="ts3" TIME_VALUE="2900"/>
        <TIME_SLOT TIME_SLOT_ID="ts4" TIME_VALUE="4440"/>
        <TIME_SLOT TIME_SLOT_ID="ts5" TIME_VALUE="4440"/>
        <TIME_SLOT TIME_SLOT_ID="ts6" TIME_VALUE="7870"/>
        <TIME_SLOT TIME_SLOT_ID="ts7" TIME_VALUE="7870"/>
etc...

变成

        <TIME_SLOT TIME_SLOT_ID="ts2" TIME_VALUE="2900"/>
        <TIME_SLOT TIME_SLOT_ID="ts4" TIME_VALUE="4440"/>
        <TIME_SLOT TIME_SLOT_ID="ts6" TIME_VALUE="7870"/>
etc...

我使用以下代码删除了 XML 中的所有其他行,这导致了上面的数据:

doc <- xmlTreeParse("SCRIPTTEST.xml", useInternalNodes = TRUE)
time_xml <- getNodeSet(doc,"//*/TIME_SLOT")
ts_correct <- time_xml[seq(0, length(time_xml), 2)]

我将数据保存为 XML,因为结果列表稍后必须集成到另一个 XML 文件中。

现在,我想重命名每个条目,使其成为常规列表,即“ts1”、“ts2”、“ts3”等。 我认为带有一些 RegEx 的 for 循环可以做到这一点,但我无法想出一种方法来确保编号正确并且保留“ts”。我最好拥有它,这样我就可以在多个文件上运行脚本,但这是次要问题。

如果您能帮助解决这个问题,我们将不胜感激,请注意,我几乎是所有编程方面的初学者!

最好, 克莱门斯

【问题讨论】:

    标签: r xml for-loop


    【解决方案1】:

    #编辑:

    step1) 将您的数据转换为向量(每个项目将是“”)

    step2) gsub(这里在mapply中使用)

    step3) 将其转换回 XML

    #my example vector: (this is not step1)
    df <- c('<TIME_SLOT TIME_SLOT_ID="ts2" TIME_VALUE="2900"/>',
            '<TIME_SLOT TIME_SLOT_ID="ts4" TIME_VALUE="4440"/>')
    
    #step2
    cnt <- seq(df) #this is just a vector numbering from 1 to x
    df1 <- mapply(function(x,y) {gsub('ID="ts." TIME', paste0('ID="ts',y,'" TIME'), x)}, x=df, y=cnt)
    df1 <- as.vector(df1)
    

    【讨论】:

    • 感谢您的回复!当我运行它时,似乎什么都没有发生。如果之前不清楚,我希望“ts2”变成“ts1”,“ts4”变成“ts2”等等,其他一切都保持原样。
    • mh..如果我猜对了,那么您只需要添加一个由“ts”组成的列,然后是递增的数字。你可以做cbind( df, paste0("ts", seq(nrow(df)) )
    • 尝试这两个似乎并没有改变我的数据中的任何内容。我还没有将 XML 节点集转换为数据框,我应该这样做吗?重申一下,我希望格式保持原样,但我想要一个脚本通过每个 TIME_SLOT_ID = "tsX" 并确保它上升 1、2、3 等。
    • 不,没有 data.frame。就像我说的,您需要先将其转换为列表或向量。我没有得到您想要替换号码并保持其余部分不变的意思。我编辑了我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-03
    • 2018-09-16
    • 2022-01-18
    • 1970-01-01
    相关资源
    最近更新 更多