Как найти десятичные знаки ниже 2 и заполнить их нулями в R

Я хотел бы объединить два набора данных на основе общего столбца. Набор данных A представляет собой изображение geoTIFF, представляющее значения RGB области. Набор данных B представляет собой облако точек со значениями xyz той же области.

Я хочу объединить информацию RGB на изображении с данными 3D. Я хотел бы использовать координаты xy двух наборов данных (которые находятся в одной и той же системе координат). Я написал скрипт, вдохновленный фрагментами кода, найденными в stackru, но мне нужно реализовать весь код (исходные коды 1, 2 и 3).

Проблема в том, что координаты xy в двух файлах имеют разную точность (десятичные числа). Набор данных A имеет от 0 до 2 цифр; Набор данных B имеет гораздо больше. Я округлил цифры набора данных B до 2. Теперь я бы хотел заполнить нулями, когда цифры набора данных A меньше 2, так что, надеюсь, окончательное слияние будет работать.

Будет ли простой оператор if нормальным, если учесть, что в моем наборе данных>280000 строк? Или я должен пойти на индексацию? В любом случае, я довольно новичок в использовании R, поэтому я надеюсь, что возможные постеры помогут мне с примером кода. Ниже мой код:

require(raster)
require(rgl)

setwd("C:/my/folder")

# Read tiff file
img <- stack("image.tif")

vals <- extract(img, 1:ncell(img))
coord <- xyFromCell(img, 1:ncell(img))
combine <- cbind(coord, vals)
remove(vals)
remove(coord)

# read POINTCLOUD and assign names
lidar <- read.table("lidardata.txt")
names(lidar) <- c("x","y","z")

decimalplaces <- function(x) {
  if ((x %% 1) != 0) {
    nchar(strsplit(sub('0+$', '', as.character(x)), ".", fixed=TRUE)[[1]][[2]])
  } else {
    return(0)
  }
}


# HERE I SHOULD PAD THE LIDAR VARIABLE WITH ZEROS IN DECIMAL POSITIONS WHEN THE DIGITS ARE LESS THAN 2!!!
lidar$xy <- do.call(paste0,lidar[,1:2])

combine$x <- round(combine$x, digits = 2)
combine$y <- round(combine$y, digits = 2)
combine$xy <- do.call(paste0,combine[1:2])

finaldata <- merge(combine,lidar,by = 'xy', all = FALSE)

РЕДАКТИРОВАТЬ 1

Как предполагает @Heroka, здесь также приведен пример того, как выглядит лидар (набор данных A), и как он должен быть после заполнения его нулями.

ЛИДАР (оригинал)

x     y     z
12    9     87
11    23.4  100

ЛИДАРЬ (изменен, с добавлением столбца 'xy' для присоединения)

x     y     z     xy
12.00 9.00  87    12.009.00
11.00 23.40 100   11.0023.40

РЕДАКТИРОВАТЬ 2

Мне каким-то образом удалось получить количество цифр во всех х и у моей переменной 'лидар' (набор данных B) с помощью counting <- sapply(lidar$x, decimalplaces)В приведенном выше примере (оригинал LIDAR) это даст [0 0] для первого (x) столбца и [0 1] для второго (y) столбца. Я должен быть в состоянии найти каждую строку в моем наборе данных xy со значением 0 или 1 в виде цифр (а не 2) и дополнить 0, как в LIDAR, измененном выше.

1 ответ

Решение

Я не понимаю, почему нужно дополнять нулями. Если координаты класса numeric и оба были округлены с помощью round (что должно исключить проблемы точности с плавающей запятой), вы можете просто объединить их. Что-то вроде этого:

lidar$x <- round(lidar$x, 2)
lidar$y <- round(lidar$y, 2)
combine$x <- round(combine$x, digits = 2)
combine$y <- round(combine$y, digits = 2)

finaldata <- merge(combine, lidar, by = c("x", "y") , all = FALSE)
Другие вопросы по тегам