【问题标题】:Increment by 1 in string replacement在字符串替换中增加 1
【发布时间】:2016-12-24 02:14:11
【问题描述】:

我有一行代码需要运行 12 次,每次都进行字符串替换。

unique1 <- unique(master[c("Country_University_1", "City_University_1", "Latitude_city_1", "Longitude_city_1")])

通过将每个列名末尾的数字加一,这将产生 12 个单独的数据帧,然后我将它们与 rbind 绑定在一起

我的目标是编写一个函数,该函数采用列名 的最后一个字符和 对象名称并像 x &lt;- x + 1 一样递增 1 并在 12 处停止。我一直在绝望地尝试编写一个看起来像

的函数
x <- c("Country_University_1", "City_University_1", "Latitude_city_1", "Longitude_city_1")
for (i in 1:12){
  gsub("i", nchar(x[1:4]-1 ) x[1:4])
  print(x)
}  

但我仍然不熟悉 R 语法。任何建议将不胜感激

完整写出,该函数将执行以下操作:

unique1 <- unique(master[c("Country_University_1", "City_University_1", "Latitude_city_1", "Longitude_city_1")])
unique2 <- unique(master[c("Country_University_2", "City_University_2", "Latitude_city_2", "Longitude_city_2")])
unique3 <- unique(master[c("Country_University_3", "City_University_3", "Latitude_city_3", "Longitude_city_3")])
unique4 <- unique(master[c("Country_University_4", "City_University_4", "Latitude_city_4", "Longitude_city_4")])
unique5 <- unique(master[c("Country_University_5", "City_University_5", "Latitude_city_5", "Longitude_city_5")])
unique6 <- unique(master[c("Country_University_6", "City_University_6", "Latitude_city_6", "Longitude_city_6")])
unique7 <- unique(master[c("Country_University_7", "City_University_7", "Latitude_city_7", "Longitude_city_7")])
unique8 <- unique(master[c("Country_University_8", "City_University_8", "Latitude_city_8", "Longitude_city_8")])
unique9 <- unique(master[c("Country_University_9", "City_University_9", "Latitude_city_9", "Longitude_city_9")])
unique10 <- unique(master[c("Country_University_10", "City_University_10", "Latitude_city_10", "Longitude_city_10")])
unique11 <- unique(master[c("Country_University_11", "City_University_11", "Latitude_city_11", "Longitude_city_11")])
unique12 <- unique(master[c("Country_University_12", "City_University_12", "Latitude_city_12", "Longitude_city_12")])

output <- rbind(unique1, unique2, unique3, unique4, unique5, unique6, unique7, unique8, unique9, unique10, unique11, unique12)

【问题讨论】:

    标签: r function loops increment


    【解决方案1】:

    重做以匹配请求。

    Base = c("Country_University_", "City_University_", "Latitude_city_", "Longitude_city_")
    output = rep(NULL,4)
    for(i in 1:12) {
        ColNames = sapply(Base, function(s) { paste(s, i, sep="") })
        output=rbind(output, unique(master[ColNames]))
    }
    

    这段代码没有测试,因为我们没有master,但输出应该是你想要的。

    【讨论】:

    • 谢谢,我编辑了我的问题,使其更加精确。我已经手动写出了完整的代码——我只是想知道我将来如何自动化它。您如何将rbind 元素包含到您的解决方案中?
    • master 是做什么的?
    • master 是包含所有 48 列的数据框的名称
    • 好的,如果没有master,我们无法测试解决方案,但我想我知道你需要什么。
    • 所有新解决方案已发布
    【解决方案2】:

    您需要对sub 使用一些正则表达式。看起来您想用增加的数字替换字符串末尾的数字,您可以检查一下,在模式中 $ 匹配字符串末尾,因此 \\d+$ 匹配字符串末尾的数字:

    for (i in 1:2) { print(sub("\\d+$", i, x)) }
    
    #[1] "Country_University_1" "City_University_1"    "Latitude_city_1"     
    #[4] "Longitude_city_1"    
    #[1] "Country_University_2" "City_University_2"    "Latitude_city_2"     
    #[4] "Longitude_city_2" 
    

    根据您的更新,您可能想要这样的东西:

    # get the number at the end of column names
    number = sub(".*_(\\d+)$", "\\1", names(master))
    
    # split the data frame by the number, rename each sub data frame and bind them together
    do.call(rbind, lapply(split.default(master, number), 
                          function(sdf) setNames(sdf, sub("_\\d+$", "", names(sdf)))))
    

    【讨论】:

      【解决方案3】:

      我们可以使用data.table 中的melt 轻松做到这一点,它可以使用多个measure patterns

      library(data.table)
      melt(setDT(master), measure = patterns("^Country", "^City", "^Latitude", "^Longitude"), 
        value.name = c("Country_University", "City_University", "Latitude_city", "Longitude_city")
               ][, variable := NULL][]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-08-23
        • 2012-11-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多