我没有发现包中replace
功能的帮助页面很有帮助。最糟糕的是,它没有可以帮助理解其工作原理的示例。base
你能解释一下如何使用它吗?一两个例子会很棒。
如果您查看该函数(通过在控制台输入它的名称),您会发现它只是该函数的一个简单的功能化版本,[<-
在?"["
. [
是 R 的一个相当基本的功能,因此建议您查看该页面以获取更多详细信息。尤其重要的是要了解索引参数(in 中的第二个参数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 <- 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)
这里有两个简单的例子
> 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
请注意,上面给出的示例中的第三个参数(值):该值是一个常数(例如,'Z' 或 c(20,30))。
使用数据框本身的值定义第三个参数可能会导致混淆。
例如,使用这样的简单数据框(使用 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
..ETC
现在假设您想要做的是将“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 替换,等等......它不会被替换两次-the-value-of-a 在该特定行中。
这是一个示例,我发现 replace() 函数有助于我深入了解。该问题需要将长整数向量更改为字符向量,并将其整数替换为给定的字符值。
## figuring out replace( )
(test <- c(rep(1,3),rep(2,2),rep(3,1)))
看起来像
[1] 1 1 1 2 2 3
我想用 A 替换每个 1,用 B 替换 2,用 C 替换 3
letts <- c("A","B","C")
所以在我自己的秘密小“脏诗”中,我使用了一个循环
for(i in 1:3)
{test <- replace(test,test==i,letts[i])}
做了我想要的
test
[1] "A" "A" "A" "B" "B" "C"
在第一句话中,我故意省略了真正的目标是使整数的大向量成为因子向量并为整数值(级别)分配一些名称(标签)。
所以在这里做replace()应用程序的另一种方法是
(test <- factor(test,labels=letts))
[1] A A A B B C
Levels: A B C