Как найти десятичные знаки ниже 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)