0

我的数据如下所示

> head(CPUE)
    Lon.rect Lat.rect         q1          q4
    1     13.5    54.25  0.1930234  1.76096260
    2     13.5    54.75 11.6866331 19.06265440
    3     13.5    55.25 24.2532215 33.64530930
    4     13.5    55.75  0.2113688  0.05731537
    5     14.5    54.25  2.5600818  8.72482876
    6     14.5    54.75 85.8657297 34.08524869

现在,我想做的是创建一个新列,该列具有多个类别(级别),基于子集“Lon.rect”和“Lat.rect”的数据组合。我想根据每列中的数据为类别命名不同的名称。例如,对于 Lon.rect = 13.5,Lat.rect = 54.25,新列中的类别名称将是“1A”,而在第二行,类别名称将是“1B”,因为 Lat.rect 包含不同的数据。第 5 行将是“2A”,依此类推。

"Lon.rect"&"Lat.rect"包含坐标(如果这对任何人都很重要)并有更多的组合。从 Lot 13.5 到 22.5 和 Lat 54.25 到 58.75。

我通过以下方式创建了一个名为“subdiv”的新列:

CPUE["subdiv"] <- NA

整个数据集现在看起来:

   > head(CPUE)
      Lon.rect Lat.rect         q1          q4 subdiv
    1     13.5    54.25  0.1930234  1.76096260     NA
    2     13.5    54.75 11.6866331 19.06265440     NA
    3     13.5    55.25 24.2532215 33.64530930     NA
    4     13.5    55.75  0.2113688  0.05731537     NA
    5     14.5    54.25  2.5600818  8.72482876     NA
    6     14.5    54.75 85.8657297 34.08524869     NA

我知道我可以输入下面的所有内容,但这需要很长时间,因为它有很多数据。

CPUE$subdiv[CPUE$Lon.rect>=13 & CPUE$Lon.rect<=14 & CPUE$Lat.rect>=54.0 & CPUE$Lat.rect<=54.5] <- "1A"
CPUE$subdiv[CPUE$Lon.rect>=13 & CPUE$Lon.rect<=14 & CPUE$Lat.rect>=54.5 & CPUE$Lat.rect<=55.0] <- "1B"
CPUE$subdiv[CPUE$Lon.rect>=13 & CPUE$Lon.rect<=14 & CPUE$Lat.rect>=55.0 & CPUE$Lat.rect<=55.5] <- "1C"

我希望我的描述很清楚,否则请不要犹豫与我联系!如果有人对任何步骤有好的解决方案,请回信!谢谢!/菲利普

编辑:

关于我的问题的更多信息

上述列的名称;“1A”、“1B”和“2A”只是说明我希望源列之间的关系如何的示例,我真的想给它们命名其他东西,但是如果有人感兴趣,我在下面得到了一些很好的帮助这个的。

就我而言,我想以Lat.rect从 37 开始的整数命名列。这 Lon.rect会有点棘手。该名称由一个字母和一个数字组成,从 G3 开始(在本例中)。每个字母的最大数字是 9,然后下一个字母从 0 开始,因此 G9 之后的下一个名称将是 H0。

如果有帮助,我不需要脚本来为整个字母表进行这种组合。最小可能的组合(我所有的数据集,目前不需要)是 F9,最大 H9。

我还想首先使用 lat 名称,然后使用 lon 名称。如果首先交换 data.frame 中列的位置然后创建名称会更容易,这会很好。

第一行的完成组合将是“37G3”,然后是第二行“38G3”。第 5 行将是“37G4”。

如果有人能够帮助我完成第二部分,我将不胜感激!

4

2 回答 2

2

使用interaction将是从列中获取levelsfromunique组合的一种方法factors。但是,我match在前两列中使用,查找元素中每个元素的table位置unique。然后我可以将paste这些值放在一起并用于as.factor强制转换为factor变量。我发现它使关卡的重命名对我来说更直观,而且它也不依赖于data.frame被排序......

a <- match( df[,1] , unique( df[,1] ) )
b <- letters[ match( df[,2] ,  unique( df[,2] ) ) ]

df$new <- as.factor( paste0( a , b ) )
#  Lon.rect Lat.rect         q1          q4 new
#1     13.5    54.25  0.1930234  1.76096260  1a
#2     13.5    54.75 11.6866331 19.06265440  1b
#3     13.5    55.25 24.2532215 33.64530930  1c
#4     13.5    55.75  0.2113688  0.05731537  1d
#5     14.5    54.25  2.5600818  8.72482876  2a
#6     14.5    54.75 85.8657297 34.08524869  2b
于 2013-10-16T14:52:12.707 回答
1

更一般地说,如果您的数据不是这样排序的(按lon然后按lat),并且您想subdiv包括所有levelslotlan,您可以:

    CPUE <- data.frame(lon = as.vector(replicate(4, sample(13.5:22.5, 10, T))),
                       lat = as.vector(replicate(4, sample(seq(54, 56.25, 0.25), 10, T))))

    num <- findInterval(CPUE$lon, sort(unique(CPUE$lon)))
    lett <- findInterval(CPUE$lat, sort(unique(CPUE$lat)))

    CPUE$subdiv <- paste(num, LETTERS[lett], sep = "")

    CPUE
        lon   lat subdiv
    1  13.5 54.50     1C #this is the first possible "lon" and the third possible "lat"
    2  15.5 54.50     3C
    3  20.5 55.25     8F #this is the eigth possible "lon" and the sixth possible "lat"
    4  19.5 54.00     7A
    5  16.5 55.75     4H

注意:如果 (1) 您不想包含所有可能的“lon”和“lat”级别,并且(2) 您的数据未按发布的方式排序,则此方法将不起作用。

编辑

也许是这样的?:

    CPUE <- data.frame(lon = sort(rep(13.5:22.5, 13)),
                       lat = rep(seq(54.25, 60.25, 0.5), 10))

    lat_names <- findInterval(CPUE$lat, sort(unique(CPUE$lat))) + 36

    lon_names <- as.vector(sapply(LETTERS, paste, 0:9, sep = ""))
    lon_names <- lon_names[match("G3", lon_names):length(lon_names)]
    lon_names <- lon_names[findInterval(CPUE$lon, sort(unique(CPUE$lon)))]

    CPUE$subdiv <- paste(lat_names, lon_names, sep = "")

    > CPUE
         lon   lat subdiv
    1   13.5 54.25   37G3
    2   13.5 54.75   38G3
    3   13.5 55.25   39G3
    4   13.5 55.75   40G3
    5   13.5 56.25   41G3
    6   13.5 56.75   42G3
    7   13.5 57.25   43G3
    8   13.5 57.75   44G3
    9   13.5 58.25   45G3
    10  13.5 58.75   46G3
    11  13.5 59.25   47G3
    12  13.5 59.75   48G3
    13  13.5 60.25   49G3
    14  14.5 54.25   37G4
    15  14.5 54.75   38G4
    16  14.5 55.25   39G4
    17  14.5 55.75   40G4
    18  14.5 56.25   41G4
    19  14.5 56.75   42G4
    20  14.5 57.25   43G4
    ....
于 2013-10-16T15:42:04.747 回答