如何根据R中两个数据集之间的条件进行多项算术运算

How to do multiple arithmetic operations according to conditions between two datasets in R

我有几个数据集。 第一个

lid=structure(list(x1 = 619490L, x2 = 10L, x3 = 0L, x4 = 6089230L, 
    x5 = 0L, x6 = -10L), class = "data.frame", row.names = c(NA, 
-1L))

第二个数据集

    lidar=structure(list(A = c(638238.76, 638238.76, 638239.29, 638235.39, 
638233.86, 638233.86, 638235.55, 638231.97, 638231.91, 638228.41
), B = c(6078001.09, 6078001.09, 6078001.15, 6078001.15, 6078001.07, 
6078001.07, 6078001.02, 6078001.08, 6078001.09, 6078001.01), 
    C = c(186.64, 186.59, 199.28, 189.37, 186.67, 186.67, 198.04, 
    200.03, 199.73, 192.14), gpstime = c(319805734.664265, 319805734.664265, 
    319805734.67875, 319805734.678768, 319805734.678777, 319805734.678777, 
    319805734.687338, 319805734.701928, 319805734.701928, 319805734.701945
    ), Intensity = c(13L, 99L, 5L, 2L, 20L, 189L, 2L, 11L, 90L, 
    1L), ReturnNumber = c(2L, 1L, 1L, 2L, 1L, 1L, 2L, 1L, 1L, 
    3L), NumberOfReturns = c(2L, 1L, 3L, 2L, 1L, 1L, 3L, 1L, 
    1L, 4L), ScanDirectionFlag = c(1L, 1L, 0L, 0L, 0L, 0L, 1L, 
    0L, 0L, 0L), EdgeOfFlightline = c(0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L), Classification = c(1L, 2L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L)), class = "data.frame", row.names = c(NA, 
-10L))

如何使用公式

lid数据集中减去lidar数据集每一行的值
(lidar$A-lid$x1)/lid$x3

然后

(lidar$B-lid$x4)/lid$x6

因此第一行将是结果

(lidar$A-lid$x1)/lid$x3=1874,876(but everything after the comma is discarded)=1874(without,876)
 (lidar$B-lid$x4)/lid$x6=1122

也在 lidar 列的数据集中 lidar$C 从最大值中减去最小值。在这种情况下 lidar$c11-lidar$c1=5,5

因此所需的输出将是

A   B   C   Intensity   ReturnNumber    NumberOfReturns row col subs(lidar$Cmax-lidar$Cmin)
638238.76   6078001.09  186.64  13  2   2   1874    1122    5,5
638238.76   6078001.09  186.59  99  1   1   1874    1122    5,5
638239.29   6078001.15  199.28  5   1   3   1874    1122    5,5
638235.39   6078001.15  189.37  2   2   2   1874    1122    5,5

所有行的减法(lidar$Cmax-lidar$Cmin)的结果总是相同的。 rowcol 这是这个算法的结果

    (lidar$A-lid$x1)/lid$x3 (row)

then

    (lidar$B-lid$x4)/lid$x6 (col)

对于逗号后面的值,这些值(行和列)是不同的,但是我们必须去掉逗号后面的部分,所以它们看起来是一样的。

如何根据这样的算术运算得到想要的输出。 您的任何帮助都是valuable.Thank您

我不确定这是不是你的意思

` 激光雷达$row <- round((激光雷达$A-lid$x1)/lid$x3, 0)

lidar$col <- (lidar$B-lid$x4)/lid$x6

lidar$cdif <- max(lidar$C)-min(lidar$C)

`

如果我理解你的目的是正确的,主要问题是如何删除逗号后面的部分,逗号在你的示例中是小数点分隔符。

如果是这样,一种方法是将数字分成两部分,一部分在逗号之前,另一部分在逗号之后,然后只提取第一部分。在 R 中,您可以通过 strsplit() 来完成此操作。但是,此函数要求输入为字符,而不是数字。因此,您需要将数字强制转换为字符,进行拆分,将结果强制转换回数字,然后提取其第一个元素。

以下是实现步骤的函数示例:

remove_after_comma <- function(num_with_comma){
    myfun <- function(num_with_comma) {
        num_with_comma|> 
        as.character() |> 
        strsplit("[,|.]") |>  
        unlist() |> 
        as.numeric() |> 
        getElement(1)
    }
    vapply(num_with_comma, myfun, FUN.VALUE = numeric(1))
}

备注:

  • [,|.] 用于预测使用 . 而不是 , 作为小数点分隔符的其他系统。
  • vapply 用于使将此函数应用于数字向量(例如数字列)成为可能。

检查:

remove_after_comma(c(a = '1,5', b = '12,74'))
# a  b 
# 1 12 

(4:10)/3
#[1] 1.333333 1.666667 2.000000 2.333333 2.666667 3.000000 3.333333
remove_after_comma ((4:10)/3)
#[1] 1 1 2 2 2 3 3

假设 lid$x3 = 10L 在你的例子中:

(lidar$A-lid$x1)/lid$x3
#[1] 1874.876 1874.876 1874.929 1874.539 1874.386 1874.386 1874.555 1874.197 #1874.191 1873.841

remove_after_comma((lidar$A-lid$x1)/lid$x3) 
#[1] 1874 1874 1874 1874 1874 1874 1874 1874 1874 1873