R在另一个数据帧中逐列选择数据帧中的列
我在尝试对数据进行子集时遇到了一个问题,也许您可以帮助我。我需要的是,当第一个数据帧中的列值等于第二个数据帧中的列值时,将第一个数据帧中的数据子集为一列 以下是我正在使用的数据帧:R在另一个数据帧中逐列选择数据帧中的列,r,subset,R,Subset,我在尝试对数据进行子集时遇到了一个问题,也许您可以帮助我。我需要的是,当第一个数据帧中的列值等于第二个数据帧中的列值时,将第一个数据帧中的数据子集为一列 以下是我正在使用的数据帧: > head(places) Zona Poble lat lon alt 1 1 Zorita 40.7353 -0.165748 691.867 2 1 Morella 40.6287 -0.113284 955.719 3 1 Forcall
> head(places)
Zona Poble lat lon alt
1 1 Zorita 40.7353 -0.165748 691.867
2 1 Morella 40.6287 -0.113284 955.719
3 1 Forcall 40.6621 -0.209759 753.882
4 2 Benasal 40.3943 -0.126111 848.171
5 2 Cati 40.4532 0.060409 667.610
6 2 Fredes 40.7079 0.167981 1194.730
> head(data)
date time stat_id lat lon tempc
1 20121122 000000 1 40.7353 -0.1657 7.98737
2 20121122 000000 2 40.6287 -0.1133 6.49903
3 20121122 000000 3 40.6621 -0.2098 7.72955
4 20121122 000000 4 40.3943 -0.1261 7.98837
5 20121122 000000 5 40.4532 0.0604 10.35480
6 20121122 000000 6 40.7079 0.1680 6.00769
如您所见,数据帧“places”中的前三位属于Zona==1,并与数据帧“data”中的前三行共享lat/lon。我想在places.dat上选择与Zona==I共享lat/lon的数据行
我正在尝试的R脚本是
datos=read.table("data.dat",header=T)
places=read.table("places.dat",header=T)
data=as.data.frame(datos)
place=as.data.frame(pobles)
data$time[data$time == 0] = "000000"
subset(data,data$lat == place$lat[place$Zona == 1])
所以,子集将在data.dat中每次显示三行,但它只选择三行中的两行,如下所示
> subset(data,data$lat == place$lat[place$Zona == 1])
date time stat_id lat lon tempc
1 20121122 000000 1 40.7353 -0.1657 7.98737
2 20121122 000000 2 40.6287 -0.1133 6.49903
385 20121122 30000 1 40.7353 -0.1657 7.00632
386 20121122 30000 2 40.6287 -0.1133 4.83684
769 20121122 60000 1 40.7353 -0.1657 6.55283
770 20121122 60000 2 40.6287 -0.1133 4.85467
1153 20121122 90000 1 40.7353 -0.1657 6.35216
1154 20121122 90000 2 40.6287 -0.1133 5.66342
1537 20121122 120000 1 40.7353 -0.1657 11.47750
1538 20121122 120000 2 40.6287 -0.1133 10.30310
1921 20121122 150000 1 40.7353 -0.1657 13.87090
1922 20121122 150000 2 40.6287 -0.1133 11.90640
2305 20121122 180000 1 40.7353 -0.1657 10.30840
2306 20121122 180000 2 40.6287 -0.1133 7.61322
2689 20121122 210000 1 40.7353 -0.1657 6.29745
2690 20121122 210000 2 40.6287 -0.1133 6.63173
3073 20121123 000000 1 40.7353 -0.1657 4.78633
3074 20121123 000000 2 40.6287 -0.1133 5.31070
3457 20121123 30000 1 40.7353 -0.1657 6.84001
3458 20121123 30000 2 40.6287 -0.1133 6.88369
3841 20121123 60000 1 40.7353 -0.1657 5.71790
我肯定错过了什么,你能帮我吗?任何想法或暗示都将不胜感激
谢谢
数据文件可在以下位置获得:
- data.dat
- places.dat
for(i in 1:128) {
for(j in 1:2) {
a=sqrt((place$lat[i]-datos$lat[j])^2+(place$lon[i]-datos$lon[j])^2)
n=which.min(a)
while(n <= 9344) {
b=cbind(i,n,datos$tempc[n],place$Zona[i])
n=n+128
}
}
}
它只给出最后一个i值的值,我想保存所有值。当然,这是一个基本的,但我不明白,请耐心,因为我不是一个有经验的R用户。再次感谢首先,您需要将位置的小数四舍五入到4位。可能这就是您遇到问题的原因:
places=read.table("places.dat",header=T)
places=round(places$lon,digits=4)
datos[which((datos$lat==places$lat & datos$lon==places$lon) & places$Zona==1),]
这种情况的结果总共是146分
编辑1(根据肖恩的评论)
在我的回答中,我假设在位置,lat是四舍五入的,并且不长
但正如肖恩所指出的,比较浮动不是一个好主意。最好计算每个位置点和datos点之间的距离,并选择距离最小的一个,小于最小距离(例如datos中点之间距离的一半),作为匹配点
编辑2
试着这样做:
b=matrix(nrow=dim(places)[1],ncol=5)
a=c()
data.p=c()
n=c()
for(i in 1:dim(places)[1]) {
for(j in 1:dim(data)[1]) {
a[j]=sqrt((places$lat[i]-data$lat[j])^2+(places$lon[i]-data$lon[j])^2)
}
data.p[i]=which.min(a)
n[i]=min(a)
}
b=cbind(places=1:(dim(places)[1]),data=data.p,distance=n,tempc=data$tempc[data.p],Zona=places$Zona)
而不是一些查询:
b[which(b[,3]<1),]
b[which(b[,3]<0.00001),]
b[哪个(b[,3]不确定你想做什么,但也许你应该先合并(),然后再合并子集?你还想匹配一个浮点数(Lat/Long)?请参考Hi@Sean,谢谢。我认为合并不是一个好主意,因为places有128行(位置)data.dat有128个位置x 72小时。可能是浮点问题。我认为小数可能是问题所在。然后我必须将lat和lon小数四舍五入到4位,以便它们在子集之前具有相同的维数。我明天在工作中试试看。谢谢,但比较两个浮点数是否相等是非常困难的即使在使用了圆形参考R-FAQ“7.31为什么R不认为这些数字是相等的?”-如果你坚持比较这些数字,为什么不转换为字符串,你也可以将lat和long组合成一个字符串…但要注意…Sean这在很大程度上取决于数据本身和坐标的获取方式(包括其精度),以及用户将如何进行此比较。我希望在相同的数据集(位置)中,具有相同数量的十进制数的lat和long不会发生这种情况,可以假设lat四舍五入为4位,而long不是,等等,因为我应该使用dist()要查找位置中的一个点和DATO中所有点之间的距离,我可以使用places$Zona为DATO分配一个新列,这就是我需要为每个places$Zona(Zona在西班牙语中表示面积)查找DATO$tempc的最大/最小值的原因。这是我第一次尝试计算R中的距离,is dist()正确的命令?您可以使用:sqrt((places$lat[i]-datos$lat[j])^2+(places$lon[i]-datos$lon[j])为places中的每个i点和datos中的所有j点计算距离。这意味着对于每个i,您将拥有一个具有相同长度DATO的距离列表。之后,您需要创建一个最小距离阈值,以避免在没有近邻的情况下选择太远的点。我不确定dist()是否能够满足您的需要。
b[which(b[,3]<1),]
b[which(b[,3]<0.00001),]