【发布时间】:2013-07-10 10:42:17
【问题描述】:
去年 11 月,我问了一个关于来自两个不同数据帧 (here) 的子集数据的问题。我想从 data1 中选择与 data2 中所需行具有相同纬度的行。现在我遇到了不一样但类似的问题。
我的数据文件有这样的结构:
数据文件
date time stat_id lat lon tempc
20121122 0 1 0.407353E+02 -0.165700E+00 0.798737E+01
20121122 0 2 0.406287E+02 -0.113300E+00 0.649903E+01
20121122 0 3 0.406621E+02 -0.209800E+00 0.772955E+01
20121122 0 4 0.403943E+02 -0.126100E+00 0.798837E+01
20121122 0 5 0.404532E+02 0.604000E-01 0.103548E+02
地点文件
Zona Poble stat_id lat lon alt
1 Zorita 1 0.407353E+02 -0.165700E+00 691.867004
1 Morella 2 0.406287E+02 -0.113300E+00 955.718994
1 Forcall 3 0.406621E+02 -0.209800E+00 753.882019
2 Benasal 4 0.403943E+02 -0.126100E+00 848.171021
2 Cati 5 0.404532E+02 0.604000E-01 667.609985
它们都共享 stat_id 字段。我想根据 places$Zona 对数据文件进行子集化。例如,如果我希望 Zona 为 1,则要提取三个位置,stat_id=1,2,3。对于子集,我使用以下命令:
zona1=subset(data,data$stat_id == places$stat_id[places$Zona == 1])
这成功地选择了三个站的数据文件中的行,但不是所有 stat_id 为 1,2 或 3 的行。数据文件包含每小时数据,但 zona1 仅显示时间 0、3、6、9、12、15 的数据,18,21,24 小时。发出命令时,我收到以下警告:
Mensajes de aviso perdidos
In data$stat_id == places$stat_id[places$Zona == 1] :
larger object length is not a multiple of the smaller one
(请原谅我对警告信息的翻译)
zona1 输出是
"","date","time","stat_id","lat","lon","tempc"
"1",20121122,0,1,40.7353,-0.1657,7.98737
"2",20121122,0,2,40.6287,-0.1133,6.49903
"3",20121122,0,3,40.6621,-0.2098,7.72955
"385",20121122,30000,1,40.7353,-0.1657,7.00632
"386",20121122,30000,2,40.6287,-0.1133,4.83684
"387",20121122,30000,3,40.6621,-0.2098,6.42246
"769",20121122,60000,1,40.7353,-0.1657,6.55283
"770",20121122,60000,2,40.6287,-0.1133,4.85467
"771",20121122,60000,3,40.6621,-0.2098,5.90663
"1153",20121122,90000,1,40.7353,-0.1657,6.35216
"1154",20121122,90000,2,40.6287,-0.1133,5.66342
"1155",20121122,90000,3,40.6621,-0.2098,6.15894
这是我正在尝试的脚本:
datos=read.table("data.dat",header=T)
pobles=read.table("pobles-zona.dat",header=T)
data=as.data.frame(datos)
places=as.data.frame(pobles)
zona1=subset(data,data$stat_id == places$stat_id[places$Zona == 1])
和数据文件在
data.dathttp://ubuntuone.com/0pDaVxaBQZWZSAVr2b3n6v
pobles-zona.dathttp://ubuntuone.com/753L9uFbntRc46Ah5gIZdp
我应该遗漏一些东西,任何帮助将不胜感激。
提前致谢
【问题讨论】:
-
只是一个猜测,但我想说缺失值会让你绊倒。看看如果将
stat_id == places$stat_id替换为stat_id %in% places$stat_id会发生什么。 (%in%忽略 NA 而不是传播它们。) -
有效!!谢谢@HongOoi 它现在运行良好,但为什么呢?数据文件中没有 NA。
-
@pacomet 我怀疑这里不是“NA”,而是
data$stat_id的长度与places$stat_id[places$Zona == 1]的长度不同,因此相等性测试会回收较短的测试,这不是你的想要。 -
@CarlWitthoft 这是一个很好的观点。地点是 128 行/站,但数据是 128x73 行。感谢您的澄清。