替换函数示例
答
如果你看一下功能(通过键入在控制台上的名字),你会看到,它只是[<-
功能的一个简单的功能化版本,它在?"["
描述。 [
对R来说是一个相当基本的功能,因此建议您查看该页面以获取更多详细信息。尤其重要的是学习,该指数参数(在replace
第二参数可以是逻辑的,数字或字符归类值当存在的第二和第三个参数不同的长度回收将发生:
> replace(1:20, 10:15, 1:2)
[1] 1 2 3 4 5 6 7 8 9 1 2 1 2 1 2 16 17 18 19 20
字符索引为一个名为向量:
> replace(c(a=1, b=2, c=3, d=4), "b", 10)
a b c d
1 10 3 4
逻辑索引:
> replace(x <- c(a=1, b=2, c=3, d=4), x>2, 10)
a b c d
1 2 10 10
答
这里有两个简单的例子
> x <- letters[1:4]
> replace(x, 3, 'Z') #replacing 'c' by 'Z'
[1] "a" "b" "Z" "d"
>
> y <- 1:10
> replace(y, c(4,5), c(20,30)) # replacing 4th and 5th elements by 20 and 30
[1] 1 2 3 20 30 6 7 8 9 10
答
您还可以使用逻辑测试
x <- data.frame(a = c(0,1,2,NA), b = c(0,NA,1,2), c = c(NA, 0, 1, 2))
x
x$a <- replace(x$a, is.na(x$a), 0)
x
x$b <- replace(x$b, x$b==2, 333)
答
请注意,上面给出的示例中的第三个参数(值):该值是一个常数(例如, 'Z'或c(20,30))。
使用数据框本身的值定义第三个参数可能会导致混淆。
E.g.用一个简单的数据帧像这样(使用dplyr :: data_frame):
tmp <- data_frame(a=1:10, b=sample(LETTERS[24:26], 10, replace=T))
这将这样的财产以后创建:
a b
(int) (chr)
1 1 X
2 2 Y
3 3 Y
4 4 X
5 5 Z
...等
现在,假设你要想要做,是将列“a”中的值乘以2,但只有列“b”是“X”。我的直接想法是这样的:
with(tmp, replace(a, b=="X", a*2))
但是,这不会提供所需的结果。 a * 2将被定义为固定向量而不是对'a'列的引用。因此,在'替换'操作开始时,向量'a * 2'将因此变为
[1] 2 4 6 8 10 12 14 16 18 20
。因此,第一行'b'等于“X”,'a'中的值将被放置2.第二次,它将被替换为4等等......它不会被两次取代在特定行中的a值。