簡體   English   中英

R - 重塑長到寬,按兩個變量分組

[英]R - Reshape long to wide, grouping by two variables

我有一個名為result的數據框,它有 4 列(x,y, label, NN.idx 和 dist),分別代表觀察在平面中的位置,一個避免 (x,y) 重復的標簽(見下面我的評論)它在另一個數據幀中的最近鄰居的索引以及到它的距離。 備注:每個 (x,y) 組合可能出現 1 到 3 次,如果出現,則通過不同的標簽來區分(例如,第 1,4 行和第 5 行以及下面的示例中)。 另外,請注意,兩個不同的點可能具有相同的標簽,這是我從之前的數據操作中計算出的數量,例如,第 1 行和第 3 行都具有相同的標簽,但它們顯然不代表相同的點 (x,y)。

這是一個例子:


result <- data.frame(x=c(0.147674, 0.235356 ,0.095337, 0.147674, 0.147674, 1.000000, 2.000000), y=c(0.132956, 0.150813, 0.087345, 0.132956, 0.132956, 2.000000, 1.000000), label = c(5,6,5,6,7,3,9), NN.idx =c(4325,2703,21282,3460,12,4,10), dist=c(0.02391247,0.03171236,0.01760940,0.03136304, 0.02315468, 0.01567365, 0.02314860))

head(result)

         x        y        label NN.idx        dist
1 0.147674 0.132956            5   4325  0.02391247
2 0.235356 0.150813            6   2703  0.03171236
3 0.095337 0.087345            5  21282  0.01760940
4 0.147674 0.132956            6   3460  0.03136304
5 0.147674 0.132956            7     12  0.02315468
6 1.000000 2.000000            3      4  5.00000000
7 2.000000 1.000000            9     10 11.00000000

我想要做的是非常有效地將此數據框(實際數據框要大得多)重塑為寬格式,其中每行對應一個唯一的(x,y) 組合,並顯示列 NN.idx_1、NN.idx_2, NN.idx_3、dist_1、dist_2、dist_3 給出原始數據幀中每次出現的 (x,y) 組合的 NN.idx 和 dist(如果 (x,y) 組合只出現兩次或一次,則用 NA 填充)

我對 R 比較data.table ,只知道基礎知識,但我想我可能有一個使用data.tabledcast的解決方案,如下所示:

df <- setDT(result)
df[,NN.counter := 1:.N, by=c("x","y")]
df <- dcast(df, x+y~ NN.counter, value.var=c("NN.idx","dist"))

head(df)

        x        y   NN.idx_1 NN.idx_2 NN.idx_3     dist_1     dist_2     dist_3
1: 0.095337 0.087345    21282       NA       NA 0.01760940         NA         NA
2: 0.147674 0.132956     4325     3460       12 0.02391247 0.03136304 0.02315468
3: 0.235356 0.150813     2703       NA       NA 0.03171236         NA         NA
4: 1.000000 2.000000        4       NA       NA 0.01567365         NA         NA
5: 2.000000 1.000000       10       NA       NA 0.02314860         NA         NA


我的問題如下:我的方法好嗎? 我不熟悉dcast並且符號x+y ~ NN.counter讓我想知道導致相同和 x+y 的兩個不同點 (x,y) 是否會被認為是不同的(例如,我原來的第 6 行和第 7 行數據幀,其中 x 和 y 顛倒)。 顯然它似乎有效。

有沒有人有更好的方法來處理這個重復的問題,或者我的好嗎? 另外,我不知道這是否相當快,盡管我讀過data.table非常快。

由於xy都是numeric ,您可能會遇到基於浮點精度的問題(即R FAQ 7.31IEEE-754 )。 雖然它可能有效,但我不知道我會嚴格依賴它(沒有大量驗證)。 在分組和dcast之前強制轉換為固定長度的字符串(例如, sprintf("%0.06f", x) )可能很有用(為了重塑)。

這是一個解決方法的想法。 (注意:我僅使用magrittr來分解帶有%>%管道的步驟,它不需要運行。)

library(data.table)
library(magrittr)
result <- data.table(x=c(0.147674, 0.235356 ,0.095337, 0.147674, 0.147674, 1.000000, 2.000000), y=c(0.132956, 0.150813, 0.087345, 0.132956, 0.132956, 2.000000, 1.000000), label = c(5,6,5,6,7,3,9), NN.idx =c(4325,2703,21282,3460,12,4,10), dist=c(0.02391247,0.03171236,0.01760940,0.03136304, 0.02315468, 0.01567365, 0.02314860))

result[, c("x_s", "y_s") := lapply(.(x, y), sprintf, fmt = "%0.09f") ]
savexy <- unique(result[, .(x, y, x_s, y_s) ]) # merge back in later with "real" numbers
result2 <- copy(result) %>%
  .[, c("x", "y") := NULL ] %>%
  .[, NN.counter := seq_len(.N), by = c("x_s", "y_s") ] %>%
  dcast(x_s + y_s ~ NN.counter, value.var = c("NN.idx", "dist") ) %>%
  merge(., savexy, by = c("x_s", "y_s"), all.x = TRUE) %>%
  .[, c("x_s", "y_s") := NULL ] %>%
  setcolorder(., c("x", "y"))
result2
#           x        y NN.idx_1 NN.idx_2 NN.idx_3     dist_1     dist_2     dist_3
# 1: 0.095337 0.087345    21282       NA       NA 0.01760940         NA         NA
# 2: 0.147674 0.132956     4325     3460       12 0.02391247 0.03136304 0.02315468
# 3: 0.235356 0.150813     2703       NA       NA 0.03171236         NA         NA
# 4: 1.000000 2.000000        4       NA       NA 0.01567365         NA         NA
# 5: 2.000000 1.000000       10       NA       NA 0.02314860         NA         NA

暫無
暫無

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

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