0

我是一个相对较新的 R 用户,但为了完成我的实习研究任务,我不得不即时自学这门语言。

我正在使用起点-终点人口普查数据文件。这个数据看起来有点像这样:

w_geocode       h_geocode S000 SA01 SA02 SA03 SE01 SE02 SE03 SI01 SI02 SI03

1  360010001001005 - 360010001001010 -  1    0    1    0    0    0    1    1    0    0

2 360010001001005 - 360010001001011  -  1    0    1    0    0    0    1    1    0    0

3 360010001001005 - 360010001001039  -  1    0    1    0    0    0    1    1    0    0

4 360010001001005 - 360010014001009  -  1    0    1    0    0    0    1    0    1    0

5 360010001001005 - 360010015001007 -   1    0    1    0    0    0    1    0    1    0

6 360010001001005 - 360010019011001  -  1    0    1    0    0    0    1    1    0    0

大约有 500 万行这样的数据。这 15 位数字中的每一个都代表一个非常具体的位置。为了使这些数据更相关,我设法使用以下方法将这 15 位代码缩短为 11 位代码:

options(scipen=100)  #to avoid scientific notation

nyod=read.csv("ny_od_main_JT00_2010.csv")

x=nyod[,1]

y=nyod[,2]

z=nyod[,3]

tx=trunc(x/10000)

ty=trunc(y/10000)

nyodI=cbind(tx,ty,z)

之后我得到这样的东西:

              tx          ty z
[1,] 36001000100 36001000100 1

[2,] 36001000100 36001000100 1

[3,] 36001000100 36001000100 1

[4,] 36001000100 36001001400 1

[5,] 36001000100 36001001500 1

[6,] 36001000100 36001001901 1

但是现在,如您所见,我有一些我想汇总的冗余。例如,理想情况下,现在我希望将第 1、2 和 3 行合并为 1,并且 z 的总和等于 3。但我需要为所有冗余完成此过程。

我希望我的问题足够具体,并且对任何可能阅读它的人都有意义。感谢您提供的任何帮助!

4

3 回答 3

2

使用base包,你只需要使用aggregate函数。

nyodI
##            tx          ty z
## 1 36001000100 36001000100 1
## 2 36001000100 36001000100 1
## 3 36001000100 36001000100 1
## 4 36001000100 36001001400 1
## 5 36001000100 36001001500 1
## 6 36001000100 36001001901 1

aggregate(z ~ tx + ty, data = nyodI, FUN = sum)
##            tx          ty z
## 1 36001000100 36001000100 3
## 2 36001000100 36001001400 1
## 3 36001000100 36001001500 1
## 4 36001000100 36001001901 1
于 2013-02-25T07:50:05.613 回答
1

您截断数据的第一部分很长,您可以这样做:

dat <- nyod[,1:3]
nyod[,1:2] <- trunc(nyod[,1:2]/1000)

其余的,您可以按照建议使用aggregateddply.

于 2013-02-25T08:03:16.750 回答
0

尝试

library(plyr) 
df <– ddply(nyodI, .(tx, ty), summarise, z.sum=sum(z)) 
于 2013-02-25T07:55:06.777 回答