【发布时间】:2012-08-02 09:44:06
【问题描述】:
我没有发现base 包中的replace 函数的帮助页面非常有用。最糟糕的是,它没有可以帮助理解其工作原理的示例。
你能解释一下如何使用它吗?一两个例子会很棒。
【问题讨论】:
标签: r
我没有发现base 包中的replace 函数的帮助页面非常有用。最糟糕的是,它没有可以帮助理解其工作原理的示例。
你能解释一下如何使用它吗?一两个例子会很棒。
【问题讨论】:
标签: r
这里有两个简单的例子
> 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
【讨论】:
如果您查看该函数(通过在控制台输入它的名称),您会发现它只是[<- 函数的简单功能化版本,在?"[" 中进行了描述。 [ 是 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 <- 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))。
使用数据框本身的值定义第三个参数可能会导致混淆。
例如使用这样的简单数据框(使用 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 替换,等等......它不会被替换两次-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
【讨论】:
c(rep(1,3),rep(2,2),rep(3,1)) 可以简化为rep(1:3, 3:1)