r - 替换矩阵中相互跟随的特定数字
问题描述
我正在处理调查数据,我想在数据框中替换特定的值 - 它们彼此跟随。
例如
v1 v2 v3 v4 v5
0 2 0 0 55
0 0 3 0 1
3 0 1 1 2
0 2 0 2 0
如果我将 (0,2,0) 替换为 1,将数据帧的其余部分替换为 0,则新矩阵将如下所示
v1 v2 v3 v4 v5
1 1 1 0 0
0 0 0 0 0
0 0 0 0 0
1 1 1 1 1
我怎样才能对 n 长度的特定数字执行此操作,即 (1,3);(1,2,4,5,8,2)?
解决方案
正如其他人指出的那样,您需要稍微澄清一下您的问题,以确保我们正确回答它。
我的假设是,您正在匹配c(0,2,0)
您展示的示例中的模式 (),并且您只匹配跨行的模式。也就是说,它不能从第 2 行第 5 列换行到第 3 行第 1 列,也不会只检查列中的匹配项。
如果这些假设是正确的,那么以下函数将起作用。它复制了您提供的示例,并返回一个矩阵。您可以使用可选参数分别修改示例中的替换值 ( rep_val
) 和填充值 ( )、1 和 0。fill_val
此功能也可以改进为更优雅,但我认为它有效。
代码
replace_pattern <- function(x, pattern, rep_with = 1, fill_val = 0)
{
n <- length(pattern)
if (n > ncol(x))
stop("pattern is longer than number of columns")
new_x <- matrix(fill_val, nrow = nrow(x), ncol = ncol(x))
# loop over each row
for (rr in seq_len(nrow(x))) {
# start matching the pattern at the entry = length of pattern
# and look backwards
for (cc in n:ncol(x)) {
cur_cols <- (cc - n + 1):cc
cur_vals <- x[rr, cur_cols]
# if it matches the pattern, replace the values with specified value
if (isTRUE(all.equal(cur_vals, pattern, check.attributes = FALSE))) {
new_x[rr, cur_cols] <- rep_with
}
}
}
new_x
}
测试
使用您的示例,并将其设置为xx
xx
:
v1 v2 v3 v4 v5
0 2 0 0 55
0 0 3 0 1
3 0 1 1 2
0 2 0 2 0
然后调用replace_pattern(xx, c(0, 2, 0))
返回您提供的第二个矩阵。
x2 <- xx
x2[2, 2] <- 1
replace_pattern(x2, c(1, 3))
回报:
[,1] [,2] [,3] [,4] [,5]
[1,] 0 0 0 0 0
[2,] 0 1 1 0 0
[3,] 0 0 0 0 0
[4,] 0 0 0 0 0
和
xx3 <- rbind(xx, c(1, 2, 4, 5, 8))
replace_pattern(xx3, c(1, 2, 4, 5, 8))
回报:
[,1] [,2] [,3] [,4] [,5]
[1,] 0 0 0 0 0
[2,] 0 0 0 0 0
[3,] 0 0 0 0 0
[4,] 0 0 0 0 0
[5,] 1 1 1 1 1
最后,replace_pattern(xx, c(1,2,4,5,8,2))
会因为模式长于列数而失败。
推荐阅读
- c# - 如果 Discord.Net C# 中不存在,如何按名称查找频道并创建它
- typescript - react-query QueryObserverResult 的打字稿问题
- python - SLACK,PYTHON:如何以机器人的身份在消息中发送文件?
- javascript - 消息 SONARqube - 通过测试每个属性来限制此循环的作用
- javascript - TestCafe 不支持剪贴板
- python - 获取 ValueError:使用 binom.rvs() 时参数中的域错误
- sas - 将不同文件夹中的多个 txt 文件读入 SAS 数据集
- node.js - 'parcel' 不是内部或外部命令、可运行程序或批处理文件。Vanilla TYPESCRIPT 代码中包裹捆绑器的错误
- javascript - 无法使用 client.channels.cache.get(")
- python - 由于 tkinter GUI 中的 tkraise() 导致位置混乱