write down,forget

R矩阵及数据框操作

<Category: R> 查看评论

R数据框操作,添加一列,并实现分组统计

rbind,基于行,cbind,基于列
矩阵合并(矩阵只能存数字,如果列为非数字,会自动处理)

> <-rbind(1:7,1:7)
> matrix
[,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,]    1    2    3    4    5    6    7
[2,]    1    2    3    4    5    6    7

> matrix<-cbind(1:7,1:7)
> matrix
[,1] [,2]
[1,]    1    1
[2,]    2    2
[3,]    3    3
[4,]    4    4
[5,]    5    5
[6,]    6    6
[7,]    7    7

#字母自动变成数列
> rbind(c(“a”,”b”,”c”),1:3
+ )
[,1] [,2] [,3]
[1,] “a”  “b”  “c”
[2,] “1”  “2”  “3”

 

现有如下数据框,需要加一列,并通过时间分组进行统计
> data
obj time
1   a    1
2   b    5
3   c   10
4   d   50
5   e  100
6   f  150
7   g  200

> cbind(data$time,1:7)
[,1] [,2]
[1,]    1    1
[2,]    5    2
[3,]   10    3
[4,]   50    4
[5,]  100    5
[6,]  150    6
[7,]  200    7

> df<-data.frame(cbind(data$time,1:7))
> df
X1 X2
1   1  1
2   5  2
3  10  3
4  50  4
5 100  5
6 150  6
7 200  7

ok,下面就是最见证奇迹的时刻了
> df[which(X1<10),][“X2″]=”<10”
> df
X1  X2
1   1 <10
2   5 <10
3  10   3
4  50   4
5 100   5
6 150   1
7 200   1

搞到不用which的新写法
> df[ df$X1>1 & df$X1<30 , “X2″]=”1~30”
>
> df
X1   X2
1   1  <10
2   5 1~30
3  10 1~30
4  50    4
5 100    5
6 150    6
7 200    7
df[which(X1<10),][“X2″]=”<10”
df[ df$X1>=10 & df$X1<30 , “X2″]=”10~30”
df[ df$X1>=30 & df$X1<50 , “X2″]=”30~50”
df[ df$X1>=50 & df$X1<70 , “X2″]=”50~70”
df[ df$X1>=70 & df$X1<90 , “X2″]=”70~90”
df[ df$X1>=90 & df$X1<100 , “X2″]=”90~100”
df[ df$X1>=100 & df$X1<150 , “X2″]=”100~150”
df[ df$X1>=150 & df$X1<200 , “X2″]=”150~200”
df[ df$X1>=200, “X2″]=”>200″

最后结果:

> df
X1      X2
1   1     <10
2   5     <10
3  10   10~30
4  50   50~70
5 100 100~150
6 150 150~200
7 200    >200

太累了,有么有高级点的办法啊?

后面找到了cut方法,使用方法如下:
break指定区间范围,cut结果输出原始数据所在的区间范围

> x
[1]  1  2  3  4  5  6  7  8  9 10
> f <- cut(x, breaks=c(0, 100, 200))
> f
[1] (0,100] (0,100] (0,100] (0,100] (0,100] (0,100] (0,100] (0,100] (0,100] (0,100]
Levels: (0,100] (100,200]

还自定义label
> f <- cut(x=df$X1, breaks=c(0, 10, 30,50,70,90),labels=c(“0~10″,”10~30″,”30~50″,”50~70″,”70~90”))
> f
[1] 0~10  0~10  0~10  30~50 <NA>  <NA>  <NA>
Levels: 0~10 10~30 30~50 50~70 70~90
tapply分组统计

> df
X1      X2
1   1     <10
2   5     <10
3  10   10~30
4  50   50~70
5 100 100~150
6 150 150~200
7 200    >200
> f <- cut(x=df$X1, breaks=c(0, 10, 30,50,70,90,200),labels=c

(“0~10″,”10~30″,”30~50″,”50~70″,”70~90″,”90~200″))
> f
[1] 0~10   0~10   0~10   30~50  90~200 90~200 90~200
Levels: 0~10 10~30 30~50 50~70 70~90 90~200
> tapply(!is.na(df$X1), df, sum)
X2
X1    <10 >200 10~30 100~150 150~200 50~70
1     1   NA    NA      NA      NA    NA
5     1   NA    NA      NA      NA    NA
10   NA   NA     1      NA      NA    NA
50   NA   NA    NA      NA      NA     1
100  NA   NA    NA       1      NA    NA
150  NA   NA    NA      NA       1    NA
200  NA    1    NA      NA      NA    NA
> f
[1] 0~10   0~10   0~10   30~50  90~200 90~200 90~200
Levels: 0~10 10~30 30~50 50~70 70~90 90~200
> tapply(!is.na(df$X1), f, sum)
0~10  10~30  30~50  50~70  70~90 90~200
3     NA      1     NA     NA      3

总结,cut返回factor变量因子,可以用来作为分组的依据,然后通过taaply,对原始的数据框进行分组统计
有了这些分组数据之后,就可以很方便用ggplot来出图了

x<-tapply(!is.na(time), f, sum)

#转换成数据框
df <- data.frame(range=rownames(x),count=x)

#画饼图
pie(x, labels = rownames(x), main=”Query Time”)

报了个错误:
#错误于pie(x, labels = rownames(x), main = “Pie Chart of Countries”) :
#’x’必需是正数.

需要处理缺失数据NA,如下即可:

#获取缺失数据
missing <- is.na(x)
#缺失数据赋值,默认值,如0
x[missing]=0

#简单用法
pie(x, labels = rownames(x), main=”Query Time”)

#标签带上百分比
slices<-x
lbls<-rownames(x)
pct <- round(slices/sum(slices)*100)
lbls <- paste(lbls, pct) # add percents to labels
lbls <- paste(lbls,”%”,sep=””) # ad % to labels
pie(slices,labels = lbls, col=rainbow(length(lbls)),
main=”Query Time”)

 
参考:
http://www.diandian.com/tag/r%E8%AF%AD%E8%A8%80
http://addictedtor.free.fr/graphiques/
http://xccds1977.blogspot.com/2012/03/reshape.html
http://www.oschina.net/code/snippet_222150_8512
http://addictedtor.free.fr/graphiques/thumbs.php

本文来自: R矩阵及数据框操作