导图社区 处理录入的数据
处理录入的数据目的在于删除部分载入R的数据,选定载入数据的子集,其实可以在载入前就整理好,但是在巨量数据处理时在R内整理有优势。
编辑于2022-06-09 22:29:03处理录入的数据
目的
删除部分载入R的数据,选定载入数据的子集
其实可以在载入前就整理好,但是在巨量数据处理时在R内整理有优势
整理数据框: names, str
经常上来就用
仪式性的使用在read table 函数之后
names函数
可以查看我们正在处理的变量,即显示数据框内所有变量
names(Squid) [1] "Sample" "Year" "Month" "Location" "Sex" "GSI"
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 ...
int代表那个变量是整数型
num代表那个变量是数值型
(GSI)
Factor
显示该变量是个因子
若你将小数点弄成,就会出现这个
因子是个错误,其不能被其它函数如均值和盒形图识别
读取数据框中单个变量: $等...
直接读取read table得到的数据框中的变量是不可行的
> GSI Error: object 'GSI' not found
函数中的data参数可指定变量所在的数据框
MI <-lm(GSI ~ factor(Location) + factor(Year), data = Squid)
优点
简洁
没必要在数据框外定义变量
缺点
并不是所有函数都支持data选项
n(GSI, data = Squid)
Error in mean(GSI, data = Squid) : object 'GSI' not found
盒型图没有data参数
对于没有data参数的函数
$符号
Squid$GSI [1] 10.4432 9.8331 9.7356 9.3107 8.9926 8.7707 8.2576 7.4045
Squid$GSI代表了squid数据框中GSI那个变量
$和变量名中可以加一个空格
缺点
无
其基本是一个完整的记录在案的变量,可应用于变量应该出现在的任何位置
选择数据框变量对应的列
> Squid[, 6] [1] 10.4432 9.8331 9.7356 9.3107 8.9926 8.7707 8.2576 7.4045
对选定的变量计算均值
mean(Squid$GSI)
缺点是少数函数会给出错误信息
mean(Squid[,6])
缺点是你可能会忘了GSI在第六列
mean(Squid[, "GSI")
attach函数
其把Squid添加到R的搜索路径里
可直接输入GSI或其它变量名而前面不带squid$
> attach(Squid)
> GSI
[1] 10.4432 9.8331 9.7356 9.3107 8.9926 8.7707 8.2576 7.4045
可以不用data参数而使用所有函数
> boxplot(GSI)
优点
非常方便
缺点
必须保证外部变量名和数据框内部变量名不能重复
而且和R自带函数名也不能重复
变量名time不行
有个函数也叫time
detach 函数
detach(Squid)
把之前添加的变量名删除..
一般当载入多个数据集,且一次处理一个时,需要再attach后加detach
访问数据子集: 布尔向量
布尔向量:访问所有的满足某种条件的数据
条件选择
基于第二个变量的值的条件下选择变量数据(或数据框)的过程
== 输出布尔向量
Sel <- Squid$Sex == 1
> Sel
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[12] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[23] FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
可见==这个指令让所有不等于其的值都为FALSE
输出了一个相同长度的向量,其false的位置恰好可以去除所有FEMALE
因为Sel和Sex有相同长度!
SquidM <- Squid[Sel, ]
所以, 所有Sel的行,就是可以指所有male的行
对于一个布尔向量,这样的输入即为选择所有Sel等于TURE的行
可以在一个命令中完成...
SquidM <- Squid[Squid$Sex == 1, ]
雌性则是
SquidF <- Squid[Squid$Sex == 2, ]
SquidM
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
62 62 1 5 3 1 3.2263
63 63 1 6 1 1 3.1848
65 65 1 6 1 1 2.9683
66 66 1 5 1 1 2.9544
67 67 1 6 1 1 2.9390
子集就这样被选定了...
稍微多元的布尔运算
数理逻辑符号
或
符号 |
和
符号 &
不等于
符号 !=
等于 ==
小于
<
大于
>
小于等于
<=
大于等于
>=
> unique(Squid$Location)
[1] 1 3 4 2
几种表示出现在位置1, 2, 3的子集的方式
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, ]
表示出现在1的雄性
SquidM.1 <- Squid[Squid$Sex == 1 & Squid$Location == 1]
表示出现在1或2的雄性
SquidM.12 <- Squid[Squid$Sex ==1 & (Squid$Location == 1 | Squid$Location == 2), ]
当布尔向量的维数和提取数据的维数不同时
SquidM <- Squid[Squid$Sex == 1, ]
SquidM1 <- SquidM[Squid$Location == 1, ]
结果会输出很多NA值
问题出在SquidM比Squid的维数小..
布尔向量Squid$Location == 1比squidM的数量长
R会自动对SquidM添加具有NAs值的多余的行
当数据框中没有满足条件的值时会
> Squid[Squid$Location == 1 & Squid$Year == 4 & Squid$Monrg == 1, ]
[1] Sample Year Month Location Sex GSI
<0 rows> (or 0-length row.names)
unique函数
其显示变量里有多少“唯一值”
即有多少种可能的值
值的种类
例子
>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
[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
>unique(Squid$Sex) [1] 2 1
1表示雄性
2表示雌性
数据排序:order函数
想在squid中根据变量“月份”的值由低到高的排列GSI数据
Ord1 <- order(Squid$Month)
Squid[Ord1, ]
> 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
5 5 1 1 1 2 8.9926
6 6 1 1 1 2 8.7707
7 7 1 1 1 2 8.2576
8 8 1 1 3 2 7.4045
若只用一个变量
>Squid$GSI[Ord1]
> 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
弄出了一个排好序的向量...
使用相同的标示符组合两个数据集: merge
所有的数据点不一定存储于相同的一个文件中
就是说你可以结合两个不同研究的数据,产生你的新结论!
Merge函数
当两个数据集文件有相同的标示符时(即有一个共同名字的变量),其可合并两个数据集,把第一个数据集中第j个样本放在第二个数据集里第j个样本的旁边
Squid <- merge(Sq1, Sq2, by = "Sample")
那个by的选项指按照Sample这个变量作为相同的标识合并两个数据集
这个缺陷是如果一边的表缺失了一行,就会“并差”,详情见书
若并不完美的对应,一个方法是将all选项设置为TRUE
缺省状态下它的设置是FALSE, 意思是Sq1和Sq2的行如果有缺失值将会被忽略,相同标识则不会相同
当设置为TRUE时, 如果Sq1里没有Sq2里出现的样本数据,用NAs填充,反之亦然。
Squid <- merge(Sq1, Sq2, by = "Sample", all = TRUE)
输出数据:write.table
是read.table的逆过程
例子
write.table(SquidM, file = "MaleSquid.txt", sep = " ", quote = FALSE, append = FALSE, na = "NA")
参数
首个
想要输出的变量
file =
"想要输出的文件名"
sep = " "
保证数据用空格隔开
quote = FALSE
消除字符串(标题)的引号标志
na = "NA"
允许你指定缺失值由什么来代替
append = FALSE
打开一个新的文件
如果设定为TRUE, 它将把变量SquidM添加到一个已存在的文件的尾部
如何让excel读
重新编码分类变量:factor
factor函数
输入一个向量,输出一系列因子...其底下会追加因子(factor)的水平种类(Levels)
其经常用于把名义变量重新编码,输出到一个新的“名义变量”里
f意义是名义变量
Squid$fLocation <- factor(Squid$Location)
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......
Levels: 1 2
可以用参数重新标记factor的levels
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
[71] M M M M M F M M M M M M M M M M M M M M M M F M M M M M M M M F M M M
[106] M M M M M M M M M M M M M M M M M M M M M M M M M..........
Levels: M F
这里每个1都被转换成一个M, 每个2都被转换成一个F
可以改变levels的顺序
默认是水平值由小到大排列
在盒型图中,位置为1的数据与位置为2的数据向量,位置为2的数据与位置为3的数据相邻
可以改变这个顺序
Squid$fLocation <- factor(Squid$Location, levels = c(2, 3, 1, 4))
这个命令不改变数据值的排列,但当生成各种图像时输出稍有不同
因为水平的顺序不同,重置水平对处理线性回归里的Posthoc检验也是有用的
这个函数的结果是在Squid数据框里面生成了一个新的因子变量,在右边多加了一列...
所以可以用
画盒型图
boxplot(GSI ~ fSex, data = Squid)
画回归线
M1 <- lm(GSI ~ fSex + fLocation, data = Squid)
这种预先定义的变量有优点
在线性回归函数中会使输出变得更短
summary(M1)
M2 <- lm(GSI ~ factor(Sex) + factor(Location), data = Squid)
这个会在屏幕上占用更多的空间
summary(M2)
as. factor
as. numeric
把因子转换成数值向量
使用因子“factor”数据
factor不是数值,所以要加引号
如
SquidM <- Squid[Squid$Sex == 1, ]
SquidM <- Squid[Squid$fSex == "1", ]
str可以观察到新定义的名义变量
'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 ...
注意后两项属性为因子
现在任何函数将把它们看做为因子