在x位数R

问题描述

我有一个带有坐标的数据框(SWEREF_99,项目3006),并且意识到很多坐标格式错误

对于北坐标,它们始终在逗号前有七个数字,而东坐标则在逗号前有六个数字,然后是十进制数字。像:6789654.234(北部)。但是,我的坐标看起来像这样; 6789654234。这意味着我要在数字4和2之间输入逗号/点。

我尝试过formatCformat,但是当我使用它们时,我会添加多个逗号,例如678.965.423.4,或者在十进制后添加零。

测试

这是一个具有虚坐标的数据框,但是它很好地描述了我的数据。

data <- data.frame(north = c(678645345,675836578,6573645.786),East = c(354674.47,37465434,4263546))

如您所见,我的一些坐标看起来不错,北坐标为7位,东坐标为6位。因此,我不想更改这些内容,而只更改那些不包含逗号的内容

有人遇到过同样的问题吗?

解决方法

尝试一下:

if (calendar[col,row] != 0)
{
   Label lbl = new Label
   {
      Content = calendar[col,row],HorizontalAlignment = HorizontalAlignment.Center,VerticalAlignment = VerticalAlignment.Center
   };

   if (col == 0)
   {
      // It is Sunday
      lbl.Foreground = Brushes.Red;
   }
   else if (col == 6)
   {
      // It is Saturday
      lbl.Foreground = Brushes.Blue;
   }

   Grid.SetColumn(lbl,col);
   Grid.SetRow(lbl,row);

   grdCalendar.Children.Add(lbl);
}
,

您可以使用正则表达式在特定位置插入小数点:

transform(data,North = sub('(.{7})\\.?(.*)','\\1.\\2',North),East = sub('(.{6})\\.?(.*)',East))

#        North      East
#1  6786453.45 354674.47
#2  6758365.78 374654.34
#3 6573645.786  426354.6

我们将数据分为两个捕获组。

第一个捕获组(.{7})-捕获前7个字符

\\.?-如果存在,则忽略可选的小数位。

第二个捕获组((.*))之后的所有内容。

我们返回两个具有反向引用的捕获组,在它们之间添加一个"."'\\1.\\2')。

East列采用相同的逻辑。

,

使用tidyverse和base-R的基本功能(grepl,substr,paste,mutate,case_when),这似乎可行。如果您不喜欢正则表达式,可以尝试以下方法:

library(dplyr)

data <- data.frame(North = c(678645345,675836578,6573645.786),East = c(354674.47,37465434,4263546))

data %>%
  mutate(North = case_when(grepl(".",as.character(North),fixed = TRUE) ~ as.character(North),TRUE ~ paste0(substr(North,1,7),".",substr(North,8,nchar(North)))),East = case_when(grepl(".",as.character(East),fixed = TRUE) ~ as.character(East),TRUE ~ paste0(substr(East,6),substr(East,7,nchar(East)))))

输出:

        North      East
1  6786453.45 354674.47
2  6758365.78 374654.34
3 6573645.786  426354.6
,

在大多数情况下,在这种情况下,将数字作为字符串进行操作比较容易。这应该可以解决您的问题:

data <- data.frame(North = c(678645345,4263546))

insertComma <- function(data,commaPosition)
{
  data.str <- as.character(data)
  data.comma <- ifelse(substr(data.str,commaPosition,commaPosition) != ".",paste0(substr(data.str,commaPosition - 1),substr(data.str,nchar(data.str))),data.str)
  return(data.comma)
}
commaPositions <- c(8,7)

sapply(seq_len(ncol(data)),function(col) insertComma(data[,col],commaPositions[col]))

     [,1]          [,2]       
[1,] "6786453.45"  "354674.47"
[2,] "6758365.78"  "374654.34"
[3,] "6573645.786" "426354.6"