第5章 对象改值

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 布尔运算符

可以将多个逻辑测试整合成一个测试语句(求交集?)

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值