簡體   English   中英

如何使用R獲取周圍單元格的ID?

[英]How to get the id of surrounding cells using R?

我有一個有 3 列的 df,第一列是 X 坐標(例如從 9 到 42 的值),第二列是 Y 坐標(例如從 13 到 30 的值),第三列是每個單元格的 id。

我需要得到一個表格,其中包含每個單元格的 id 及其周圍單元格的名稱。 根據單元格的不同,它最多可以有八個鄰居,但有時會更少(例如在邊界中)。

另一個重要的一點是 df 沒有完全完成,即有一些組合 XY 沒有值。

有人知道用 R 做到這一點的方法嗎?

根據您的描述,您的數據如下所示:

head(df)
#    id  x  y
# 1 ID1 36 29
# 2 ID2 21 27
# 3 ID3 35 13
# 4 ID4 35 21
# 5 ID5 29 29
# 6 ID6 34 27
...

正如您所指出的,如果您的數據采用矩陣格式,則可以更輕松地執行此操作。 您可以輕松創建一個; 它只需要足夠大以容納您的最大 x 和 y 值,並有一個額外的行和列,以便您可以巧妙地處理邊緣和角落。

我們最初將使條目全部為空字符串。

mat <- matrix(rep("", (max(df$x) + 1) * (max(df$y) + 1)), ncol = max(df$x + 1))

現在我們可以使用 x 和 y 索引將 id 寫入矩陣中的適當位置:

for(i in 1:nrow(df)) mat[df$y[i], df$x[i]] <- as.character(df$id[i])

現在,查找數據框中每個條目的 8 個鄰居就像檢查 8 個相鄰矩陣條目一樣簡單。 表示這一點的最簡潔的方法是保留原始數據框並為 8 個相對羅盤位置中的每一個添加一個新列:

df$east      <- mat[df$y     + nrow(mat) * (df$x - 2)]
df$west      <- mat[df$y     + nrow(mat) * (df$x)]
df$north     <- mat[df$y + 1 + nrow(mat) * (df$x - 1)]
df$south     <- mat[df$y - 1 + nrow(mat) * (df$x - 1)]
df$southeast <- mat[df$y - 1 + nrow(mat) * (df$x - 2)]
df$southwest <- mat[df$y - 1 + nrow(mat) * (df$x)]
df$northeast <- mat[df$y + 1 + nrow(mat) * (df$x - 2)]
df$northwest <- mat[df$y + 1 + nrow(mat) * (df$x)]

現在我們有:

head(df)
#    id  x  y east  west north south southeast southwest northeast northwest
# 1 ID1 36 29             ID26 ID317     ID279                         ID182
# 2 ID2 21 27                  ID178      ID63     ID205                ID97
# 3 ID3 35 13            ID291                                              
# 4 ID4 35 21            ID239 ID338     ID328      ID29                    
# 5 ID5 29 29                                      ID268      ID78      ID85
# 6 ID6 34 27 ID20 ID271  ID41 ID154     ID143      ID80      ID72     ID279

為了證明這是有效的,我們可以這樣做:

df$north[1]
# [1] "ID26"
df$south[which(df$id == "ID26")]
# [1] "ID1"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM