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

时间:2013-02-06 20:05:52

标签: r replace indexing

ETA:顺便说一句,下面的要点是不必迭代我的整个列向量集,以防万一这是一个提议的解决方案(只是做了已知的事情)一次工作一次。)


有很多例子用R替换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

并说我希望4var1var2的所有值都为10

我确信这是基本的,我只是没有正确地思考它。我一直在尝试这样的事情:

data[data[, 2:3] == 4, ]

这不起作用,但如果我使用data[, 2]而不是data[, 2:3]执行相同的操作,那么一切正常。似乎逻辑测试(如is.na())适用于多行/列,但数值比较效果不佳?

感谢您的任何建议!

4 个答案:

答案 0 :(得分:48)

您希望在整个数据框中搜索与您尝试替换的值相匹配的任何值。与运行逻辑测试的方式相同,例如用10 ..替换所有缺失值

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

你也可以用10s替换所有4s。

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

答案 1 :(得分:5)

基本上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

答案 2 :(得分:2)

只是提供一个不同的答案,我想我会写一个矢量数学方法:

您可以使用矢量化的'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

答案 3 :(得分:0)

仅为了连续性

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

但它看起来很难看,所以在两步中做得更好。