1.就地改值
1.1利用R的记号体系在R对象内部改值
(1)改单值
> vec<-c(1,2,3,4,5,6)
> vec
[1] 1 2 3 4 5 6
> vec[1]<-100
> vec
[1] 100 2 3 4 5 6
(2)批量改值,只要提供相同个数的待改值和新值
> vec[c(1,2,3)]<-c(4,5,6)
> vec
[1] 4 5 6 4 5 6
> deck2[ ,"value"]<-1:52 #也可以deck2$value<-1:52
> head(deck2)
face suit value
1 king spades 1
2 queen spades 2
3 jack spades 3
4 ten spades 4
5 nine spades 5
6 eight spades 6
> vec[4:6]<-vec[4:6]+1
> vec
[1] 4 5 6 8 6 7
(3)创建一个原先对象中并不存在的新值
> vec[7]<-0
> vec
[1] 4 5 6 8 6 7 0
> deck2$new<-1:52 #也可以deck2[ ,"new]<-1:52
> head(deck2)
face suit value new
1 king spades 1 1
2 queen spades 2 2
3 jack spades 3 3
4 ten spades 4 4
5 nine spades 5 5
6 eight spades 6 6
(4)删除值 NULL
> deck2$new<-NULL
> head(deck2)
face suit value
1 king spades 1
2 queen spades 2
3 jack spades 3
4 ten spades 4
5 nine spades 5
6 eight spades 6
如何将扑克牌中A的值改为14?
1.没洗牌前,易知A的位置
#用R的记号体系得到所有的A 牌
> deck2[c(13,26,39,52), ]
face suit value
13 ace spades 1
26 ace clubs 1
39 ace diamonds 1
52 ace hearts 1
#用两种方法提取A牌的点数值
> deck2[c(13,26,39,52),3]
[1] 1 1 1 1
> deck2$value[c(13,26,38,52)] #提取这些行的value值
[1] 1 1 2 1
#给A牌新赋值
> deck2$value[c(13,26,38,52)]<-c(14,14,14,14)
> deck2$value[c(13,26,38,52)]
[1] 14 14 14 14
> deck2[c(13,26,39,52),3]<-c(14,14,14,14)
> deck2[c(13,26,39,52),3]
[1] 14 14 14 14
1.2注意
(1)这些替换操作是即使进行的,且发生在数据集内部。因此操作不会生成deck2的副本,而是直接出现在deck2中
(2)无论是数据存储在向量、矩阵、数组、列表还是数据框中,这个方法同样适用。只需要用R的记号体系明确描述想要替换的值,再使用赋值符用新值替换掉原值即可。
但是洗牌后就不知道A的位置了——逻辑值取子集
2.逻辑值取子集
提供了一种精确提取和替换R对象中值的方法,有点类似在数据集中进行地毯式搜索
回顾:逻辑值索引系统
> vec<-1:6
> vec[c(F,F,F,T,F,F)]
[1] 4
2.1 逻辑测试
可以利用逻辑值测试选择一个对象中符合一定条件的特定值。并快递定位、提取以及修改数据集中的某些个别数值
PS:逻辑值取子集对于向量化编程来说至关重要,向量化编程能让你写出可快速高效运行的R代码
(1)每一种运算符都会返回一个逻辑值,TRUE或FALSE。如果将这些运算符应用于向量间的判别,R会将两个向量中的每个元素一一进行对比。
> 1>2
[1] FALSE
> 1>c(0,1,2)
[1] TRUE FALSE FALSE
> c(1,2,3)==c(1,2,4)
[1] TRUE TRUE FALSE
(2)%in%是唯一不进行一一对比的运算符,只是测试左边的值是否出现在其右边的对象之中
> 1%in%c(2,3,4)
[1] FALSE
> c(1,2)%in%c(1,2,4,5)
[1] TRUE TRUE
(3)注:比较两个对象是否相等时用==,单等号=为赋值号
(4)强制转换
用逻辑运算符对比的两个对象属于不同类型时,R会在进行实际对比前,使用强制转换规则将它们转换成同一类型
练习1
1.测试
> deck$face
[1] "king" "queen" "jack" "ten" "nine" "eight" "seven" "six" "five"
[10] "four" "three" "two" "ace" "king" "queen" "jack" "ten" "nine"
[19] "eight" "seven" "six" "five" "four" "three" "two" "ace" "king"
[28] "queen" "jack" "ten" "nine" "eight" "seven" "six" "five" "four"
[37] "three" "two" "ace" "king" "queen" "jack" "ten" "nine" "eight"
[46] "seven" "six" "five" "four" "three" "two" "ace"
#两种方法都可以
> deck2[ ,"face"]=="ace"
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[13] TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[25] FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[37] FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[49] FALSE FALSE FALSE TRUE
> "ace"==deck2$face
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[13] TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[25] FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[37] FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[49] FALSE FALSE FALSE TRUE
2.计算有多少个TRUE值 sum函数
R在对逻辑型对象进行运算时,会将逻辑型强制转换为数值型。也就是所有TRUE会变为1,FALSE变为2
> sum("ace"==deck2$face)
[1] 4
3.把所有A 牌的点值赋为14
> deck$value["ace"==deck2$face] #R会忽略逻辑值为0的
[1] 1 1 1 1
> deck$value["ace"==deck2$face]<-14
> deck$value["ace"==deck2$face]
[1] 14 14 14 14
> deck2["ace"==deck$face,"value"] #R会忽略逻辑值为0的
[1] 1 1 1 1
> deck2["ace"==deck$face,"value"]<-14
> deck2["ace"==deck$face,"value"]
[1] 14 14 14 14
练习2
> deck2$value<-0
> head(deck2)
face suit value
1 king spades 0
2 queen spades 0
3 jack spades 0
4 ten spades 0
5 nine spades 0
6 eight spades 0
1.使所红桃牌点数更改为1
> deck4$suit=="hearts"
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[13] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[25] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[37] FALSE FALSE FALSE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
[49] TRUE TRUE TRUE TRUE
> deck4$value[deck4$suit=="hearts"]
[1] 0 0 0 0 0 0 0 0 0 0 0 0 0
> deck4$value[deck4$suit=="hearts"]<-1
> deck4$value[deck4$suit=="hearts"]
[1] 1 1 1 1 1 1 1 1 1 1 1 1 1
>
2.将黑桃Q改为13
(1)先找出所有Q牌
> deck5[deck5$face=="queen", ]
face suit value
2 queen spades 12
15 queen clubs 12
28 queen diamonds 12
41 queen hearts 12
#自己的思路
> deck6<-deck5[deck5$face=="queen", ]
[1] 12
> deck6$value[deck6$suit=="spades"]<-13 #将deck6中花色为spades的数值改为13
> deck6
face suit value
2 queen spades 13
15 queen clubs 12
28 queen diamonds 12
41 queen hearts 12
(2)找出所有黑桃
> deck5[deck5$suit=="spades", ]
face suit value
1 king spades 13
2 queen spades 12
3 jack spades 11
4 ten spades 10
5 nine spades 9
6 eight spades 8
7 seven spades 7
8 six spades 6
9 five spades 5
10 four spades 4
11 three spades 3
12 two spades 2
13 ace spades 1
(3)若将(1)的前半部分和(2)结合,我们要找的是同时满足花色是黑桃、牌面是Q的,可以使用布尔运算符——
2.2 布尔运算符
可以将多个逻辑测试整合成一个测试语句(求交集?)