R-通过两个变量将长形重塑为宽形

R-通过两个变量将长形重塑为宽形,r,data.table,reshape,R,Data.table,Reshape,我有一个名为result的数据框,它有4列(x,y,label,NN.idx和dist),分别表示观测在平面中的位置,一个标签用于避免(x,y)重复(见下面的备注)另一个数据框中其最近邻的索引和到它的距离。 备注:每个(x,y)组合可能出现一到三次,如果出现,则通过不同的标签(例如,第1、4和5行以及下面的示例)来区分。另外,请注意,两个不同的点可能具有相同的标签,这是根据以前的数据处理计算的数量I,例如,第1行和第3行具有相同的标签,但它们显然不代表相同的点(x,y) 以下是一个例子: re

我有一个名为
result
的数据框,它有4列(x,y,label,NN.idx和dist),分别表示观测在平面中的位置,一个标签用于避免(x,y)重复(见下面的备注)另一个数据框中其最近邻的索引和到它的距离。 备注:每个(x,y)组合可能出现一到三次,如果出现,则通过不同的标签(例如,第1、4和5行以及下面的示例)来区分。另外,请注意,两个不同的点可能具有相同的标签,这是根据以前的数据处理计算的数量I,例如,第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
我的问题是:我的方法行吗?我不熟悉
dcast
,并且表示法
x+y~NN。计数器
使我想知道导致相同x+y和的两个不同点(x,y)是否会被视为不同(例如,原始数据帧的第6行和第7行,其中x和y是反向的)。显然,这似乎奏效了


是否有人有更好的方法来处理这个重复问题,或者我的方法可以吗?另外,我不知道这是否相当快,尽管我读过
数据。table
相当快。

由于
x
y
都是
数值的
,您可能会遇到基于浮点精度的问题(即和)。虽然它可能会工作,但我不知道我会严格依赖它(没有很多验证)。在分组和
dcast
ing之前,强制使用固定长度的字符串(例如,
sprintf(“%0.06f”,x)
)可能是有用的(为了重塑形状)

这里有一个想法可以解决这个问题。(注意:我使用
magrittr
仅仅是为了用
%%>%%
管道分解步骤,它不需要运行。)

库(data.table)
图书馆(magrittr)
结果%
dcast(x_s+y_s~NN.counter,value.var=c(“NN.idx”,“dist”))%>%
合并(,savexy,by=c(“x_-s”,“y_-s”),all.x=TRUE)%>%
[,c(“x_s”,“y_s”):=NULL]]>%
设置颜色器(,c(“x”,“y”))
结果2
#x y NN.idx_1 NN.idx_2 NN.idx_3 dist_1 dist_2 dist_3
#1:0.095337 0.087345 21282 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 0.03171236 NA
#4:1.0000002.0000004 NA 0.01567365 NA
#5:2.000000 1.000000 10 NA 0.02314860 NA

顺便说一句,
+
是术语分隔符,在公式中,它不是算术加法。您也可以在公式中直接使用
rowid
dcast(setDT(result),x+y~rowid(x,y),value.var=c(“NN.idx”,“dist”))没有考虑到浮点精度!非常感谢你的回答!
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