【问题标题】:R:: reverse a string from "x,y" to "y,x" in rR:: 在 r 中将字符串从 "x,y" 反转为 "y,x"
【发布时间】:2021-07-01 01:10:14
【问题描述】:

我有一张这样的桌子

aa<-tribble(
  ~"a",~"b",~"c",~"d",
" 78.1445111, 9.9365072",   "78.1444646, 9.9365044", " 78.1445111, 9.9365072",  "78.1444646, 9.9365044", 
"78.1444197, 9.9365166",    "78.1443816, 9.9365422",
"78.142359, 9.9365748", "78.1421918, 9.9366057",
"78.1421918, 9.9366057",    "78.1419488, 9.9367106",
"78.1444197, 9.9365166",    "78.1443816, 9.9365422",
"78.142359, 9.9365748", "78.1421918, 9.9366057",
"78.1421918, 9.9366057",    "78.1419488, 9.9367106",
  )

这些是“经纬度”值。我想将它们转换为“long, lat”。例如,我想将“78.1445111, 9.9365072”转换为“9.9365072,78.1445111”。是否可以在 r 中对所有列进行自动化处理?

我希望在所有列中都有这样的输出:

   a<- tribble(
      ~"a",~"b",~"c",~"d",
    "9.9365072,78.1445111", "9.9365044,78.1444646,", "9.9365072,78.1445111",    "9.9365044,78.1444646,", 
    "9.9365166,78.1444197", "9.9365422,78.1443816",
    "9.9365748,78.142359",  "9.9366057,78.1421918",
    "9.9366057,78.1421918", "9.9367106,78.1419488",
    "9.9365166,78.1444197", "9.9365422,78.1443816",
    "9.9365748,78.142359",  "9.9366057,78.1421918",
    "9.9366057,78.1421918", "9.9367106,78.1419488"
      )

我尝试过,但失败了:

bag_1<-list()
for(i in colnames(a)){
dummy <-str_split_fixed(a[[i]], ",", 2)

 bag_1[[i]]<-dummy
  
dum<-do.call(rbind,bag_1)
}

【问题讨论】:

    标签: r tidyverse stringr strsplit csv


    【解决方案1】:

    基础 R 选项:

    写一个函数来反转一个字符串:

    reverse_string <- function(x) {
      trimws(paste(sub('.*,', '', x), sub(',.*', '', x), sep = ','))
    }
    

    使用lapply 将其应用于每一列。

    aa[] <- lapply(aa, reverse_string)
    aa
    
    # A tibble: 4 x 4
    #    a                     b                    c                     d                   
    #  <chr>                 <chr>                <chr>                 <chr>               
    #1 9.9365072, 78.1445111 9.9365044,78.1444646 9.9365072, 78.1445111 9.9365044,78.1444646
    #2 9.9365166,78.1444197  9.9365422,78.1443816 9.9365748,78.142359   9.9366057,78.1421918
    #3 9.9366057,78.1421918  9.9367106,78.1419488 9.9365166,78.1444197  9.9365422,78.1443816
    #4 9.9365748,78.142359   9.9366057,78.1421918 9.9366057,78.1421918  9.9367106,78.1419488
    

    【讨论】:

      【解决方案2】:

      Base R 中,您可以颠倒每列的strsplit() 字符向量的顺序:

      
      sapply(aa, function(x){
        # first strsplit
        tmp1 <- strsplit(x, ", ", fixed = T)
                          
        # reverse and paste 
        sapply(tmp1, function(z){
          paste(rev(z), collapse = ", ")
        })
      })
      
      # yields
      
      #      a                        b                       c                        d                      
      # [1,] "9.9365072, 78.1445111" "9.9365044, 78.1444646" "9.9365072,  78.1445111" "9.9365044, 78.1444646"
      # [2,] "9.9365166, 78.1444197"  "9.9365422, 78.1443816" "9.9365748, 78.142359"   "9.9366057, 78.1421918"
      # [3,] "9.9366057, 78.1421918"  "9.9367106, 78.1419488" "9.9365166, 78.1444197"   "9.9365422, 78.1443816"
      # [4,] "9.9365748, 78.142359"   "9.9366057, 78.1421918" "9.9366057, 78.1421918"  "9.9367106, 78.1419488"
      

      【讨论】:

        【解决方案3】:

        你可以使用 dplyr::mutate 和 stringr::str_replace:

          # across all column
               aa %>% mutate(across(everything(),
          # capture the non-comma characters into 2 groups
                      ~ str_replace((.),"([^,]+),([^,]+)",
          # switch first and second capture groups around
                        "\\2,\\1"))) 
        

        【讨论】:

          【解决方案4】:

          这样可以吗?使用dplyrtidyr 函数

          library(tidyverse)
          
          aa %>% mutate(id = row_number()) %>% 
            pivot_longer(cols = -id) %>%
            separate(value, into = c("Lat", "Long"), sep = ", ") %>%
            mutate(new = paste(Long, Lat, sep = ", ")) %>%
            select(-Lat, -Long) %>%
            pivot_wider(id_cols = id, names_from = name, values_from = new)
          
          # A tibble: 4 x 5
               id a                     b                     c                     d                    
            <int> <chr>                 <chr>                 <chr>                 <chr>                
          1     1 9.9365072, 78.1445111 9.9365044, 78.1444646 9.9365072, 78.1445111 9.9365044, 78.1444646
          2     2 9.9365166, 78.1444197 9.9365422, 78.1443816 9.9365748, 78.142359  9.9366057, 78.1421918
          3     3 9.9366057, 78.1421918 9.9367106, 78.1419488 9.9365166, 78.1444197 9.9365422, 78.1443816
          4     4 9.9365748, 78.142359  9.9366057, 78.1421918 9.9366057, 78.1421918 9.9367106, 78.1419488
          

          aa 已使用

          aa <- tribble(
            ~"a",~"b",~"c",~"d",
            "78.1445111, 9.9365072",   "78.1444646, 9.9365044", "78.1445111, 9.9365072",  "78.1444646, 9.9365044", 
            "78.1444197, 9.9365166",    "78.1443816, 9.9365422",
            "78.142359, 9.9365748", "78.1421918, 9.9366057",
            "78.1421918, 9.9366057",    "78.1419488, 9.9367106",
            "78.1444197, 9.9365166",    "78.1443816, 9.9365422",
            "78.142359, 9.9365748", "78.1421918, 9.9366057",
            "78.1421918, 9.9366057",    "78.1419488, 9.9367106",
          )
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2023-03-20
            • 2022-11-13
            • 2010-11-25
            • 1970-01-01
            • 2021-11-01
            • 1970-01-01
            • 2021-01-27
            • 1970-01-01
            相关资源
            最近更新 更多