dataframe常见操作

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

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


2.合并数据
(1)data.frame(x,y)
x,y是dataframe或者一列数据,x和y的行数一样,该操作得到一个新的dataframe,
该dataframe是x和y拼合而成,行数与x/y的行数相同,列数为x和y的列数和。
例:
 
> x<-c(1:10)
> y<-x^2
> newdata<-data.frame(x,y)
> head(newdata)
  x  y
1 1  1
2 2  4
3 3  9
4 4 16
5 5 25
6 6 36
> z<-c(2:11)
> newdata<-data.frame(newdata, z)
> head(newdata)
  x  y z
1 1  1 2
2 2  4 3
3 3  9 4
4 4 16 5
5 5 25 6
6 6 36 7

(2)cbind(x,y)
等同于data.frame(x,y)

(3)rbind(x,y)
x,y均为data.frame,要求x和y的列向量个数一致,该操作得到一个新的dataframe,
该dataframe是x和y的数据拼接起来,行数等于x和y的行数之和,列数等于x/y的列数
例:
 
> t<-c(0,0,0)
> newdata<-rbind(newdata, t)
> newdata
    x   y  z
1   1   1  2
2   2   4  3
3   3   9  4
4   4  16  5
5   5  25  6
6   6  36  7
7   7  49  8
8   8  64  9
9   9  81 10
10 10 100 11
11  0   0  0

3.筛选数据
(1)subset:从一个dataframe中筛选出符合条件的数据
 
> newdata
    x   y  z
1   1   1  2
2   2   4  3
3   3   9  4
4   4  16  5
5   5  25  6
6   6  36  7
7   7  49  8
8   8  64  9
9   9  81 10
10 10 100 11
11  0   0  0



> newdata.subset<-subset(newdata, z>5)
> newdata.subset
    x   y  z
5   5  25  6
6   6  36  7
7   7  49  8
8   8  64  9
9   9  81 10
10 10 100 1



> subset(newdata, z>6&x>8)
    x   y  z
9   9  81 10
10 10 100 11



> subset(newdata, z>6|x!=0)
    x   y  z
1   1   1  2
2   2   4  3
3   3   9  4
4   4  16  5
5   5  25  6
6   6  36  7
7   7  49  8
8   8  64  9
9   9  81 10
10 10 100 11
 
(2)transform:对一个dataframe做一些变换 

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

> z # z是一个dataframe

x y
1 1 5
2 2 9
3 3 4

> w # w是一个dataframe
w1 w2
1 5 2.5
2 4 2.0
3 9 3.0

现在想将w的第二列按照z的第二列和w的第一列的对应关系合并到z里面
即变成:
x y w2
1 1 5 2.5
2 2 9 3.0
3 3 4 2.0

merge( z w by.x= 'y' by.y= 'w1' sort= F)
    y  x    w2
1  5  1  2.5
2  9  2  3.0
3  4  3  2.0


6.数据聚合,融合(需要载入reshape包)
(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)
          X          Y Label Logit SVM
1 0.2655087 0.52601906     1     0   1
2 0.3721239 0.07333542     1     0   1
3 0.5728534 0.84974175     1     0   1
4 0.9082078 0.42305801     0     0   0
5 0.2016819 0.98809607     0     0   1
6 0.8983897 0.47887413     0     0   0
> dim(df)
[1] 2500    5
> predictions <- melt(df, id.vars = c('X', 'Y'))
> head(predictions)
          X          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
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值