加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

R.dataframe常用操作

(2018-09-20 08:47:52)
分类: Analytics
https://blog.csdn.net/ytadx/article/details/42142979

在使用R做数据挖掘时,最常用的数据结构莫过于dataframe了,下面列出几种常见的dataframe的操作方法。

1,查看数据

 


  1. head(dataframe) # 查看数据前10行
  2. tail(dataframe) # 查看数据后10行

2,合并数据
(1)data.frame(x,y)
x,y是dataframe或者一列数据,x和y的行数一样,该操作得到一个新的dataframe,该dataframe是x和y拼合而成,行数与x/y的行数相同,列数为x和y的列数和。

 


 


  1. > x<-c(1:10)
  2. > y<-x^2
  3. > newdata<-data.frame(x,y)
  4. > head(newdata)
  5. x y
  6. 1 1 1
  7. 2 2 4
  8. 3 3 9
  9. 4 4 16
  10. 5 5 25
  11. 6 6 36
  12. > z<-c(2:11)
  13. > newdata<-data.frame(newdata, z)
  14. > head(newdata)
  15. x y z
  16. 1 1 1 2
  17. 2 2 4 3
  18. 3 3 9 4
  19. 4 4 16 5
  20. 5 5 25 6
3.筛选数据
(1)subset:从一个dataframe中筛选出符合条件的数据


> newdata
      z
    2
    3
    4
  16  5
  25  6
  36  7
  49  8
  64  9
  81 10
10 10 100 11
11    0
 
> newdata.subset<-subset(newdata, z>5)
> newdata.subset
      z
  25  6
  36  7
  49  8
  64  9
  81 10
10 10 100 1
 
> subset(newdata, z>6&x>8)
      z
  81 10
10 10 100 11
 
> subset(newdata, z>6|x!=0)
      z
    2
    3
    4
  16  5
  25  6
  36  7
  49  8
  64  9
  81 10
10 10 100 11

2)transform:对一个dataframe做一些变换

> newdata.tran<-transform(newdata, newx=-x, newy=log(y))
 
> newdata.tran
      z newx
     -1
     -2
     -3
  16   -4
  25   -5
  36   -6
  49   -7
  64   -8
  81 10   -9
10 10 100 11  -10
11      0
 
> newdata.tran
      z newx     newy
     -1 0.000000
     -2 1.386294
     -3 2.197225
  16   -4 2.772589
  25   -5 3.218876
  36   -6 3.583519
  49   -7 3.891820
  64   -8 4.158883
  81 10   -9 4.394449
10 10 100 11  -10 4.605170
11         -Inf


4,去除重复数据
> x<-c(1,0,1,0);
> y<-c(0,0,1,0)
> test<-data.frame(x,y)
> test
  x y
1 1 0
2 0 0
3 1 1
4 0 0
> duplicated(test)
[1] FALSE FALSE FALSE  TRUE
 
> test1<-test[which(!duplicated(test)),]
> test1
  x y
1 1 0
2 0 0
3 1 1
 
5,两种数据按照指定KEY聚合

 

(1)merge

1)melt(data, id.vars, measure.vars)
data以id.vars指定的列为key,将measure.vars指定的列做拆分,以前的key->a1,a2,...aN 拆成 key->a1, key->a2, ..., key->aN。在拆分的时候增加一个label,表明a1,a2,...,aN来源于以前的data中的哪一列。

例:df是一个dataframe,包含x,y坐标,对应的label,以及用logit和svm预测的结果,我们希望按照x,y把一行数据按照label,logit,svm拆成三行数据,分别用不同的标号代表来源于label、logit还是svm,然后用另外一个标号表示原来label,logit,svm的取值,因此原来2500行的数据会被拆分成7500个(2500*3),同时原来5列变量变成4列变量(x,y,值来源于哪一列,该列的取值)


> head(df)

                  Y Label Logit SVM

1 0.2655087 0.52601906           1

2 0.3721239 0.07333542           1

3 0.5728534 0.84974175           1

4 0.9082078 0.42305801           0

5 0.2016819 0.98809607           1

6 0.8983897 0.47887413           0

> dim(df)

[1] 2500    5

> predictions <- melt(df, id.vars = c('X', 'Y'))

> head(predictions)

                  Y variable value

1 0.2655087 0.52601906    Label     1

2 0.3721239 0.07333542    Label     1

3 0.5728534 0.84974175    Label     1

4 0.9082078 0.42305801    Label     0

5 0.2016819 0.98809607    Label     0

6 0.8983897 0.47887413    Label     0

> dim(predictions)

[1] 7500    4

> table(predictions$variable)

Label Logit   SVM 

 

 2500  2500  250

2)cast
head(installations)
# Package User Installed
#1 abind 1 1
#2 AcceptanceSampling 1 0
#3 ACCLMA 1 0
#4 accuracy 1 1
#5 acepack 1 0
#6 aCGH.Spline 1 0
 
# Ninth code snippet
 
library('reshape')
 
# user和Package构成一个矩阵,矩阵的数值用installed列对应的数填充,即matrix(i,j)表示用户i是否有安装packagej
 
user.package.matrix <- cast(installations, User ~ Package, value = 'Installed') 
 
user.package.matrix[, 1] # 第一列表示user的编号
 
# [1] 1 3 4 5 6 7 8 9 11 13 14 15 16 19 21 23 25 26 27 28 29 30 31 33 34
# [26] 35 36 37 40 41 42 43 44 45 46 47 48 49 50 51 54 55 56 57 58 59 60 61 62 63
# [51] 64 65
 
user.package.matrix[, 2] # 后面n列表示每个user是否有按照某个Package包
 
# [1] 1 1 0 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 0 0 1 1 1 1 1 1 1 0 1 0 1 0 1 1 1 1 1 1
# [39] 1 1 1 1 1 1 1 1 0 1 1 1 1 1

ss

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有