预计到达时间:顺便说一句,下面的要点是不必迭代我的整个列向量集,以防万一这是一个建议的解决方案(只需执行一次已知有效的操作) .
有很多用其他值替换 R 中数据帧的单个向量中的值的示例。
以及如何用其他值替换
NA
的所有值:
我正在寻找的内容与上一个问题类似,但基本上是尝试用一个值替换另一个值。对于多列满足条件的情况,或者只是尝试对多个列执行前两个问题的操作,我无法生成映射到实际数据帧的逻辑值数据帧。
一个例子:
data <- data.frame(name = rep(letters[1:3], each = 3), var1 = rep(1:9), var2 = rep(3:5, each = 3))
data
name var1 var2
1 a 1 3
2 a 2 3
3 a 3 3
4 b 4 4
5 b 5 4
6 b 6 4
7 c 7 5
8 c 8 5
9 c 9 5
并说我希望
4
和 var1
中 var2
的所有值均为 10
。
我确信这是基本的,我只是没有正确思考。我一直在尝试这样的事情:
data[data[, 2:3] == 4, ]
这不起作用,但如果我用
data[, 2]
而不是 data[, 2:3]
做同样的事情,事情就会很好。似乎逻辑测试(如is.na()
)适用于多行/列,但数字比较效果不佳?
感谢您的建议!
您想要在整个数据框中搜索与您尝试替换的值相匹配的任何值。 您可以以同样的方式运行逻辑测试,例如用 10 替换所有缺失值..
data[ is.na( data ) ] <- 10
您也可以将所有 4 替换为 10。
data[ data == 4 ] <- 10
至少我认为这就是你所追求的?
假设您想忽略第一行(因为它都是字母)
# identify which columns contain the values you might want to replace
data[ , 2:3 ]
# subset it with extended bracketing..
data[ , 2:3 ][ data[ , 2:3 ] == 4 ]
# ..those were the values you're going to replace
# now overwrite 'em with tens
data[ , 2:3 ][ data[ , 2:3 ] == 4 ] <- 10
# look at the final data
data
基本上
data[, 2:3]==4
为您提供了 data[,2:3]
而不是 data
的索引:
R > data[, 2:3] ==4
var1 var2
[1,] FALSE FALSE
[2,] FALSE FALSE
[3,] FALSE FALSE
[4,] TRUE TRUE
[5,] FALSE TRUE
[6,] FALSE TRUE
[7,] FALSE FALSE
[8,] FALSE FALSE
[9,] FALSE FALSE
所以你可以尝试这个:
R > data[,2:3][data[, 2:3] ==4]
[1] 4 4 4 4
只是为了提供不同的答案,我想我会写一个向量数学方法:
您可以使用矢量化的“ifelse”语句创建一个转换矩阵(这里实际上是一个数据框,但工作原理相同),并将转换矩阵与原始数据相乘,如下所示:
df.Rep <- function(.data_Frame, .search_Columns, .search_Value, .sub_Value){
.data_Frame[, .search_Columns] <- ifelse(.data_Frame[, .search_Columns]==.search_Value,.sub_Value/.search_Value,1) * .data_Frame[, .search_Columns]
return(.data_Frame)
}
要将第 2 列到第 3 列的数据框“数据”中的所有值 4 替换为 10,您可以使用如下函数:
# Either of these will work. I'm just showing options.
df.Rep(data, 2:3, 4, 10)
df.Rep(data, c("var1","var2"), 4, 10)
# name var1 var2
# 1 a 1 3
# 2 a 2 3
# 3 a 3 3
# 4 b 10 10
# 5 b 5 10
# 6 b 6 10
# 7 c 7 5
# 8 c 8 5
# 9 c 9 5
只是为了连续性
data[,2:3][ data[,2:3] == 4 ] <- 10
但是看起来很难看,所以分两步做比较好。
整洁宇宙
这是一个
dplyr
解决方案:
library(dplyr)
data |>
mutate(across(var1:var2, \(x) replace(x, x == 4, 10)))
# name var1 var2
# 1 a 1 3
# 2 a 2 3
# 3 a 3 3
# 4 b 10 10
# 5 b 5 10
# 6 b 6 10
# 7 c 7 5
# 8 c 8 5
# 9 c 9 5