用R中的另一个值替换数据框多列中出现的数字

用R中的另一个值替换数据框多列中出现的数字,r,replace,indexing,R,Replace,Indexing,ETA:顺便说一句,下面的要点是不必遍历我的整个列向量集,以防这是一个建议的解决方案(只需一次做已知的工作) 有很多例子可以用其他值替换R中数据帧的单个向量中的值 以及如何用其他内容替换NA的所有值: 我所寻找的与上一个问题类似,但基本上是试图用一个值替换另一个值。对于多列满足条件的情况,或者只是尝试在多个列上执行前两个问题中的操作,我很难生成映射到实际数据帧的逻辑值数据帧 例如: data <- data.frame(name = rep(letters[1:3], ea

ETA:顺便说一句,下面的要点是不必遍历我的整个列向量集,以防这是一个建议的解决方案(只需一次做已知的工作)


有很多例子可以用其他值替换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
这是行不通的,但是如果我用
data[,2]
而不是
data[,2:3]
做同样的事情,事情就会很顺利。似乎逻辑测试(如
is.na()
)可以在多行/多列上运行,但数字比较并没有发挥那么好的作用


谢谢你的建议

您希望在整个数据框中搜索与您试图替换的值匹配的任何值。同样,您可以运行逻辑测试,如用10替换所有缺失的值

data[ is.na( data ) ] <- 10

data[is.na(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
只是为了延续

    data[,2:3][ data[,2:3] == 4 ] <- 10

data[,2:3][data[,2:3]==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)
}

测试
应该是
数据
,否:)我发誓我试过这个,但以前对我不起作用。我希望达到这样的境界,我不会每次发帖子都踢自己,所以。。。顺便说一句,你是1分钟录像的人,是吗!?“那些石头!”安东尼,回答得很好,谢谢你;同样有效。我只是觉得Anthony写的有点简单。非常感谢你解释为什么我的不起作用;在玩了更多的游戏之后,我明白了你的意思:我尝试基于比较将值应用于数据,这也是子集,这更有意义。
R > data[,2:3][data[, 2:3] ==4]
[1] 4 4 4 4
    data[,2:3][ data[,2:3] == 4 ] <- 10
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)
}
# 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