R 学习笔记《六》 R语言初学者指南--访问变量、处理数据子集

注意:关闭R之前务必保存工作空间,保证学习的连续性。这样以前数据的控制台命令执行的效果以及相关变量仍然保存在内存中。

1 访问数据框变量

建议:在read.table命令执行names查看要处理的变量

names(Squid)
[1] "Sample"   "Year"     "Month"    "Location" "Sex"      "GSI"

1.1 str函数

str函数可以查看数据框中每个变量的属性:

str(Squid)
‘data.frame‘:   2644 obs. of  6 variables:
 $ Sample  : int  1 2 3 4 5 6 7 8 9 10 ...
 $ Year    : int  1 1 1 1 1 1 1 1 1 1 ...
 $ Month   : int  1 1 1 1 1 1 1 1 1 2 ...
 $ Location: int  1 3 1 1 1 1 1 3 3 1 ...
 $ Sex     : int  2 2 2 2 2 2 2 2 2 2 ...
 $ GSI     : num  10.44 9.83 9.74 9.31 8.99 ...

  

Sample  ,Yead,Month,Location,Sex这几个变量是整型

GSI这个变量是数值型

GSI这个变量是存在于数据框Squid中的,不能通过在R控制台中输入GSI查看

GSI
错误: 找不到对象‘GSI‘

1.2 函数中的数据参数--访问数据框中的变量的最佳方式

M1 <- lm(GSI ~ factor(Location)+factor(Year),data = Squid)
M1

Call:lm(formula = GSI ~ factor(Location) + factor(Year), data = Squid)

Coefficients:      (Intercept)  factor(Location)2  factor(Location)3  factor(Location)4             1.3939            -2.2178            -0.1417             0.3138      factor(Year)2      factor(Year)3      factor(Year)4             1.3548             0.9564             1.2270  

lm 是做线性回归的函数,data = Squid表示从数据框Squid中取变量

data = 并不是适用于任何函数,eg:

mean(GSI,data = Squid)
错误于mean(GSI, data = Squid) : 找不到对象‘GSI‘

1.3 $ 符号 访问变量的另外一种方法

Squid$GSI 

Squid$GSI
[1] 10.4432  9.8331  9.7356  9.3107  8.9926  8.7707  8.2576  7.4045
[9]  7.2156  6.8372  6.3882  6.3672  6.2998  6.0726  5.8395  5.8070
[17]  5.7774  5.7757  5.6484  5.6141  5.6017  5.5510  5.3110  5.2970
[25]  5.2253  5.1667  5.1405  5.1292  5.0782  5.0612  5.0097  4.9745

或者

Squid[,6]

Squid[,6]
[1] 10.4432  9.8331  9.7356  9.3107  8.9926  8.7707  8.2576  7.4045
[9]  7.2156  6.8372  6.3882  6.3672  6.2998  6.0726  5.8395  5.8070
[17]  5.7774  5.7757  5.6484  5.6141  5.6017  5.5510  5.3110  5.2970
[25]  5.2253  5.1667  5.1405  5.1292  5.0782  5.0612  5.0097  4.9745

此时可以通过mean求平均值

mean(Squid$GSI)
[1] 2.187034

1.4 attach 函数

attach函数将数据框添加到R的搜索路径中,此时就可以通过GSI命令直接查看GSI数据

attach(Squid)
GSI
[1] 10.4432  9.8331  9.7356  9.3107  8.9926  8.7707  8.2576  7.4045
[9]  7.2156  6.8372  6.3882  6.3672  6.2998  6.0726  5.8395  5.8070
[17]  5.7774  5.7757  5.6484  5.6141  5.6017  5.5510  5.3110  5.2970
[25]  5.2253  5.1667  5.1405  5.1292  5.0782  5.0612  5.0097  4.9745

此时就可以直接使用相关函数了。

boxplot(GSI)

(额、、看不懂这个图)

使用attach函数显然应该小心保证变量名字的唯一性,如果与R自带函数名字或者变量一样肯定会出问题。

attach使用总结:

(1)为了避免复制变量,避免输入Squid$GSI两次以上

(2)使用attach命令应该保证变量的唯一性

(3)如果要处理多个数据集,而且一次只处理一个数据集,使用detach函数将数据集从R搜索路径中删除

2 访问数据集

首先执行detach(Squid)命令!!!

查看Squid中Sex的值

Squid$Sex
[1] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2
[36] 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 1 1 1 1 2 1 1 1 1 1 1

  

显示位移值

unique(Squid$Sex)
[1] 2 1

其中1表示雄性2表示雌性

Sel <- Squid$Sex == 1
SquidM <- Squid[Sel,]
SquidM
     Sample Year Month Location Sex    GSI
24       24    1     5        1   1 5.2970
48       48    1     5        3   1 4.2968
58       58    1     6        1   1 3.5008
60       60    1     6        1   1 3.2487
61       61    1     6        1   1 3.2304

Sel <- Squid$Sex == 1这条命令生成一个向量与Sex具有相同的长度,如果Sex的值等于1则该变量的值为TRUE,否则为FALSE,这样一个变量可称为布尔变量,可以用来选择行。

SquidM <- Squid[Sel,]这条命令表示选择Squid中Sel等于TRUE的行,并将数据存储到SquidM中。因为是选择行,所以需要使用方阔号。

第三章未完待续...

go  on

获得雌性数据

SquidF <- Squid[Squid$Sex == 2,]
SquidF
     Sample Year Month Location Sex     GSI
1         1    1     1        1   2 10.4432
2         2    1     1        3   2  9.8331
3         3    1     1        1   2  9.7356
4         4    1     1        1   2  9.3107
5         5    1     1        1   2  8.9926

下面几条命令不解释:

unique(Squid$Location)
Squid123 <- Squid[Squid$Location == 1 | Squid$Location ==2 | Squid$Location == 3,]
Squid123 <- Squid[Squid$Location != 4,]
Squid123 <- Squid[Squid$Location < 4 ,]
Squid123 <- Squid[Squid$Location <=3 ,]
Squid123 <- Squid[Squid$Location >=1 &Squid$Location <=3 ,]

  

都是获得Location值为1,2,3的行

unique(Squid$Location)
[1] 1 3 4 2
Squid123 <- Squid[Squid$Location == 1 | Squid$Location ==2 | Squid$Location == 3,]
Squid123
     Sample Year Month Location Sex     GSI
1         1    1     1        1   2 10.4432
2         2    1     1        3   2  9.8331
3         3    1     1        1   2  9.7356
4         4    1     1        1   2  9.3107
5         5    1     1        1   2  8.9926
6         6    1     1        1   2  8.7707

获得Location值为1的雄性数据行

SquidM.1 <- Squid[Squid$Sex == 1 & Squid$Location == 1,]
SquidM.1
     Sample Year Month Location Sex    GSI
24       24    1     5        1   1 5.2970
58       58    1     6        1   1 3.5008
60       60    1     6        1   1 3.2487

获得位置为1或2的雄性数据

SquidM.12 <- Squid[Squid$Sex == 1 &( Squid$Location == 1 | Squid$Location == 2),]
SquidM.12
     Sample Year Month Location Sex    GSI
24       24    1     5        1   1 5.2970
58       58    1     6        1   1 3.5008
60       60    1     6        1   1 3.2487

注意!:

SquidM1 <- SquidM[Squid$Location == 1,]
SquidM1
        Sample Year Month Location Sex    GSI
24          24    1     5        1   1 5.2970
58          58    1     6        1   1 3.5008 

..........

..........

NA          NA   NA    NA       NA  NA     NA
NA.1        NA   NA    NA       NA  NA     NA
NA.2        NA   NA    NA       NA  NA     NA
NA.3        NA   NA    NA       NA  NA     NA
NA.4        NA   NA    NA       NA  NA     NA
..........

原因分析:

之前得到的SquidM表示雄性数据,显然SquidM的行数与Squid$Location == 1 布尔向量的长度不一致。因此导出出现上面的现象。

2.1 数据排序

Ord1 <- order(Squid$Month)
Squid[Ord1,]
     Sample Year Month Location Sex     GSI
1         1    1     1        1   2 10.4432
2         2    1     1        3   2  9.8331
3         3    1     1        1   2  9.7356
4         4    1     1        1   2  9.3107

根据月份排序

也可以只对一个变量进行排序

Squid$GSI[Ord1]
[1] 10.4432  9.8331  9.7356  9.3107  8.9926  8.7707  8.2576  7.4045
[9]  7.2156  6.3882  6.0726  5.7757  1.2610  1.1997  0.8373  0.6716
[17]  0.5758  0.5518  0.4921  0.4808  0.3828  0.3289  0.2758  0.2506
[25]  0.2092  0.1792  0.1661  0.1618  0.1543  0.1541  0.1490  0.1379

3 使用相同的标识符组合两个数据集

setwd("E:/R/R-beginer-guide/data/RBook")
Sql1 <- read.table(file = "squid1.txt",header = TRUE)
Sql2 <- read.table(file = "squid2.txt",header = TRUE)
SquidMerged <- merge(Sql1,Sql2,by = "Sample")
SquidMerged
     Sample     GSI YEAR MONTH Location Sex
1         1 10.4432    1     1        1   2
2         2  9.8331    1     1        3   2
3         3  9.7356    1     1        1   2
4         5  8.9926    1     1        1   2
5         6  8.7707    1     1        1   2
6         7  8.2576    1     1        1   2

merge 命令采用两个数据框Sql1 ,Sql2作为参数并使用变量Sample作为形同的标识符合并两个数据。merger函数还有一个选项是all,缺省状态值是FALSE:即如果Sql1或Sql2中的值有缺失,则将被忽略。如果all的值设置为TRUE,可能会产生NA值

Sql11 <- read.table(file = "squid1.txt",header = TRUE)
Sql21 <- read.table(file = "squid2.txt",header = TRUE)
SquidMerged1 <- merge(Sql11,Sql21,by = "Sample")
SquidMerged1

  

额、、这里好像没有出现NA,看来是数据没有丢失

4 输出数据

通过write.table将数据输出为ascii文件

write.table(SquidM,file = "MaleSquid_wujiahua.txt",sep = " ",quote =  FALSE,append = FALSE,na = "NA")

  

查看工作目录,生成了一个MaleSquid_wujiahua.txt文件,

打开:

Sample Year Month Location Sex GSI
24 24 1 5 1 1 5.297
48 48 1 5 3 1 4.2968
58 58 1 6 1 1 3.5008
60 60 1 6 1 1 3.2487
61 61 1 6 1 1 3.2304

  

说明:

write.table第一个参数表示要输出的数据,第二参数是数据保存的文件名,sep = " " 宝成数据通过空格隔开,qoute=FALSE消除字符串的引号标识,na="NA"表示缺失值通过NA替换。append=TRUE表示把数据添加到文件的尾部

5 重新编码分类变量

str(Squid)
‘data.frame‘:   2644 obs. of  6 variables:
 $ Sample  : int  1 2 3 4 5 6 7 8 9 10 ...
 $ Year    : int  1 1 1 1 1 1 1 1 1 1 ...
 $ Month   : int  1 1 1 1 1 1 1 1 1 2 ...
 $ Location: int  1 3 1 1 1 1 1 3 3 1 ...
 $ Sex     : int  2 2 2 2 2 2 2 2 2 2 ...
 $ GSI     : num  10.44 9.83 9.74 9.31 8.99 ...

其中Sex和locaton的值确定,属于分类变量。

在数据框中一般根据分类变量生成新的变量

Squid$fLocation <- factor(Squid$Location)
Squid$fSex <- factor(Squid$Sex)
Squid$fLocation
   [1] 1 3 1 1 1 1 1 3 3 1 1 1 1 1 1 1 3 1 3 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1
  [36] 1 1 1 1 3 1 1 1 1 3 1 1 3 1 1 1 1 1 1 1 3 1 1 1 1 1 3 1 1 1 1 1 1 1 1

Squid$fSex
   [1] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2
  [36] 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 1 1 1 1 2 1 1 1 1 1 1
  .....................
  [71] 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 2 1 1 1
  .....................
  .....................
  .....................
[2591] 1 1 1 1 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 2 1 2 1 1 2 1 1 2 1 2 2 1 1 1 1
[2626] 1 1 1 1 1 2 1 1 1 2 1 2 1 2 1 2 1 1 1
Levels: 1 2

fLocation和fSex只是名义变量,f表示他们是因子

levels:1,2可以对其修改

Squid$fSex <- factor(Squid$Sex,levels = c(1,2),labels = c("M","F"))
Squid$fSex
   [1] F F F F F F F F F F F F F F F F F F F F F F F M F F F F F F F F F F F
  [36] F F F F F F F F F F F F M F F F F F F F F F M F M M M M F M M M M M M
  ..................
  ..................
  ..................
[2556] F M M M M F F M M M M M M M F M M M M M M F M M F M M M F M M F M M M
[2591] M M M M M M M M M F M M F M M F M M M F M F M M F M M F M F F M M M M
[2626] M M M M M F M M M F M F M F M F M M M
Levels: M F

这样每个1被M替换,2被F替换

使用重新分类的因子变量

boxplot(GSI ~ fSex,data = Squid)

M1 <- lm(GSI ~ fSex+fLocation,data = Squid)
M1

Call:
lm(formula = GSI ~ fSex + fLocation, data = Squid)

Coefficients:
(Intercept)        fSexF   fLocation2   fLocation3   fLocation4
     1.3593       2.0248      -1.8552      -0.1425       0.5876
summary(M1)

Call:
lm(formula = GSI ~ fSex + fLocation, data = Squid)

Residuals:
    Min      1Q  Median      3Q     Max
-3.4137 -1.3195 -0.1593  1.2039 11.2159

Coefficients:
            Estimate Std. Error t value Pr(>|t|)
(Intercept)  1.35926    0.07068  19.230   <2e-16 ***
fSexF        2.02481    0.09427  21.479   <2e-16 ***
fLocation2  -1.85525    0.20027  -9.264   <2e-16 ***
fLocation3  -0.14248    0.12657  -1.126   0.2604
fLocation4   0.58756    0.34934   1.682   0.0927 .
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 

Residual standard error: 2.415 on 2639 degrees of freedom
Multiple R-squared: 0.1759,     Adjusted R-squared: 0.1746
F-statistic: 140.8 on 4 and 2639 DF,  p-value: < 2.2e-16

  

(才发现有这么一个插入脚本功能)

M2 <- lm(GSI ~ factor(Sex)+factor(Location),data = Squid)
summary(M2)

Call:
lm(formula = GSI ~ factor(Sex) + factor(Location), data = Squid)

Residuals:
    Min      1Q  Median      3Q     Max
-3.4137 -1.3195 -0.1593  1.2039 11.2159

Coefficients:
                  Estimate Std. Error t value Pr(>|t|)
(Intercept)        1.35926    0.07068  19.230   <2e-16 ***
factor(Sex)2       2.02481    0.09427  21.479   <2e-16 ***
factor(Location)2 -1.85525    0.20027  -9.264   <2e-16 ***
factor(Location)3 -0.14248    0.12657  -1.126   0.2604
factor(Location)4  0.58756    0.34934   1.682   0.0927 .
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 

Residual standard error: 2.415 on 2639 degrees of freedom
Multiple R-squared: 0.1759,     Adjusted R-squared: 0.1746
F-statistic: 140.8 on 4 and 2639 DF,  p-value: < 2.2e-16

  

估计的参数是一致的,但是第二种方式占用的屏幕空间更大,传说在二阶,三阶交互作用时将是一个严重的问题。

Squid$fLocation
   [1] 1 3 1 1 1 1 1 3 3 1 1 1 1 1 1 1 3 1 3 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1
  [36] 1 1 1 1 3 1 1 1 1 3 1 1 3 1 1 1 1 1 1 1 3 1 1 1 1 1 3 1 1 1 1 1 1 1 1
........
[2626] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
Levels: 1 2 3 4

  

Levels:的顺序可以更改

Squid$fLocation <- factor(Squid$Location,levels= c(2,3,1,4))
Squid$fLocation
   [1] 1 3 1 1 1 1 1 3 3 1 1 1 1 1 1 1 3 1 3 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1
  [36] 1 1 1 1 3 1 1 1 1 3 1 1 3 1 1 1 1 1 1 1 3 1 1 1 1 1 3 1 1 1 1 1 1 1 1
  [71] 1 1 1 1 1 3 1 1 3 1 1 3 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 3 1 3 3 3 1 3 1

...

] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
Levels: 2 3 1 4
boxplot(GSI ~ fLocation,data = Squid)

  

注意:

SquidM <- Squid[Squid$Sex == 1,]
SquidM <- Squid[Squid$fSex == "1"]

  

在定义了fSex这个因子之后上面两种写法都是一样的效果。

但是1有双引号是必须的,因为fSex是因子

定义新的变量之后也可以通过str命令查看

Squid$fSex <- factor(Squid$Sex,labels = c("M","F"))
Squid$fLocation <- factor(Squid$Location)
str(Squid)
‘data.frame‘:   2644 obs. of  8 variables:
 $ Sample   : int  1 2 3 4 5 6 7 8 9 10 ...
 $ Year     : int  1 1 1 1 1 1 1 1 1 1 ...
 $ Month    : int  1 1 1 1 1 1 1 1 1 2 ...
 $ Location : int  1 3 1 1 1 1 1 3 3 1 ...
 $ Sex      : int  2 2 2 2 2 2 2 2 2 2 ...
 $ GSI      : num  10.44 9.83 9.74 9.31 8.99 ...
 $ fLocation: Factor w/ 4 levels "1","2","3","4": 1 3 1 1 1 1 1 3 3 1 ...
 $ fSex     : Factor w/ 2 levels "M","F": 2 2 2 2 2 2 2 2 2 2 ...

第三章总结:

write.table    把一个变量写入到ascii文件中      write.table(Squid,file="test.txt")

order           确定数据的排序                      order(x)

merge          合并两个数据框                      merege(a,b,by="ID")

str               显示一个对象的内部结构          str(Squid)

factor           定义变量作为因子                  factor(x)

时间: 2024-10-18 21:30:08

R 学习笔记《六》 R语言初学者指南--访问变量、处理数据子集的相关文章

R语言初学者指南pdf

下载地址:网盘下载 作者阿兰·F·祖尔等的基于他们对应用科学家讲授统计与R的丰富经验,为读者献上了<R语言初学者指南>这本书.为了避免同时讲授R与统计的困难,统计方法保持在最低限度.<R语言初学者指南>包括如何下载与安装R,载入和处理数据,基本绘图,函数简介,高级绘图以及初学者常见的错误.这本书包括了你开始学习R时想知道的所有内容. 阿兰·F·祖尔资深统计学家,担任英国的一家统计咨询有限公司Highland Statistics的董事长.他已经给5000多名生态学家讲授了统计,是英

初探swift语言的学习笔记六(ARC-自动引用计数,内存管理)

Swift使用自动引用计数(ARC)来管理应用程序的内存使用.这表示内存管理已经是Swift的一部分,在大多数情况下,你并不需要考虑内存的管理.当实例并不再被需要时,ARC会自动释放这些实例所使用的内存. 另外需要注意的: 引用计数仅仅作用于类实例上.结构和枚举是值类型,而非引用类型,所以不能被引用存储和传递. swift的ARC工作过程 每当创建一个类的实例,ARC分配一个内存块来存储这个实例的信息,包含了类型信息和实例的属性值信息. 另外当实例不再被使用时,ARC会释放实例所占用的内存,这些

Lua学习笔记(六):函数-续

Lua中的函数是带有词法定界(lexical scoping)的第一类值(first-class values).第一类值指:在Lua中函数和其他值(数值.字符串)一样,函数可以被存放在变量中,也可以存放在表中,可以作为函数的参数,还可以作为函数的返回值.词法定界指:嵌套的函数可以访问他外部函数中的变量.这一特性给Lua提供了强大的编程能力. Lua中关于函数稍微难以理解的是函数也可以没有名字,匿名的.当我们提到函数名(比如print),实际上是说一个指向函数的变量,像持有其他类型的变量一样:

python之raw_input()(学习笔记六)

python之raw_input()(学习笔记六) 我们经常使用raw_input()读取用户的输入,如下例子所示: >>> name = raw_input('please input your name:'),截图如下: 下面简单说下,raw_input()与if搭配使用,脚本如下: #!/usr/bin/env python # -*- coding:utf-8 -*- birth = raw_input('birth:') if birth < 2000: print '0

swift学习笔记(六)析构过程和使用闭包对属性进行默认值赋值

一.通过闭包和函数实现属性的默认值 当某个存储属性的默认值需要定制时,可以通过闭包或全局函数来为其提供定制的默认值. 注:全局函数结构体和枚举使用关键字static标注    函数则使用class关键字标注 当对一个属性使用闭包函数进行赋值时,每当此属性所述的类型被创建实例时,对应的闭包或函数会被调用,而他们的返回值会被作为属性的默认值. ESC: Class SomeCLass{ let someProperty:SomeType={ //给someProperty赋一个默认值 //返回一个与

java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)

java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessController的checkPerssiom方法,访问控制器AccessController的栈检查机制又遍历整个 PerssiomCollection来判断具体拥有什么权限一旦发现栈中一个权限不允许的时候抛出异常否则简单的返回,这个过程实际上比我的描述要复杂 得多,这里我只是简单的一句带过,因为这

Java学习笔记(Java语言规范,API,JDK,IDE)

Java语言规范:java.sun.com/docs/books/jls 三个版本的API:J2SE J2EE J2ME 1. J2SE 客户端独立应用程序或者applet 2. J2EE 服务端应用程序 [Java Servlets&JavaServer Page] 3. J2ME 移动设备变成 JDK为Java开发提供一个开发环境(IDE) Java学习笔记(Java语言规范,API,JDK,IDE)

Linux System Programming 学习笔记(六) 进程调度

1. 进程调度 the process scheduler is the component of a kernel that selects which process to run next. 进程调度器需要使 处理器使用率最大化,并且提供 使多个进程并发执行的虚拟 Deciding which processes run, when, and for how long is the process scheduler's fundamental responsibility. 时间片:th

Go语言学习笔记(一) [Go语言的HelloWorld]

日期:2014年7月18日 1.简介 Go 编程语言是一个使得程序员更加有效率的开源项目.Go 是有表达力.简 洁.清晰和有效率的.它的并行机制使其很容易编写多核和网络应用,而新奇的类型系统允许构建有性的模块化程序.Go 编译到机器码非常快 速,同时具有便利的垃圾回收和强大的运行时反射.它是快速的.静态类型编译语言,但是感觉上是动态类型的,解释型语言. Go 是第一个实现了简单的(或更加简单的)并行开发,且跨平台的类 C 语言. 2.Go语言文档查看 安装好Go语言之后,其文档可以通过go do