对于每一行,将特定列(由另一个数据框定义)中的值替换为向量中的值

时间:2020-06-20 19:50:33

标签: r dataframe replace

让我们说:

set.seed(42)
df1 <- data.frame(v1=rnorm(10) , v2=rnorm(10), v3=rnorm(10), v4=rnorm(10))

以及

df2 <- data.frame(v1=rnorm(10) , v2=rnorm(10), v3=rnorm(10), v4=rnorm(10))
vector <- c(17,21,33,41,50,63,72,81,91,10)

df1和df2具有相同的列名,并且df2是通过处理df1生成的。

对于df2中的每一行,我想用向量的相应值替换df1中满足条件< 0.5的值。

例如,如果df1中第一行的任何列的值都小于0.5,则df2中第一行的相应列将必须替换为向量的第一元素,那是17。对于第二行,它们将替换为21等。

我看到了一些apply,而定制函数可以解决这个问题,但我无法弄清楚。预先感谢您的解决方案。

2 个答案:

答案 0 :(得分:3)

1)

我的方法是:

idx <- df1 < .5
tmp <- idx * vector
df2[idx] <- tmp[idx]

2)

@MartinGal在评论中提供的第二个选项:

df2 * (df1>=0.5) + (df1<0.5) * vector

结果是

df2
#           v1            v2          v3         v4
#1  -1.4936251  5.676206e-01 -0.08610730 17.0000000
#2  21.0000000  2.100000e+01 -0.88767902 21.0000000
#3  33.0000000  6.288407e-05 33.00000000 33.0000000
#4  41.0000000  1.122890e+00 -0.02944488 41.0000000
#5  50.0000000  5.000000e+01 50.00000000 50.0000000
#6  -0.4282589  6.300000e+01 63.00000000 63.0000000
#7  72.0000000  7.200000e+01 72.00000000 72.0000000
#8  81.0000000  8.100000e+01 81.00000000 -0.8002822
#9  -1.2247480  9.100000e+01 91.00000000 91.0000000
#10  0.1795164 -5.246948e-02 10.00000000 10.0000000

我们首先检查df1< .5的哪个位置,然后将其乘以vector以获得此矩阵

idx <- df1 < .5
tmp <- (idx) * vector
tmp
#      v1 v2 v3 v4
# [1,]  0  0  0 17
# [2,] 21 21  0 21
# [3,] 33  0 33 33
# [4,] 41  0  0 41
# [5,] 50 50 50 50
# [6,]  0 63 63 63
# [7,] 72 72 72 72
# [8,] 81 81 81  0
# [9,]  0 91 91 91
#[10,]  0  0 10 10

这些是您要在df2等于idx的位置插入TRUE的值。

所以下一步是使用逻辑矩阵,即df2替换idx中的那些值:

df2[idx] <- tmp[idx]

答案 1 :(得分:1)

我们还可以使用Map中的base R

data.frame(Map(function(x, y) ifelse(x < 0.5, vector, y) , df1, df2))

或使用map2中的purrr

library(purrr)
map2_df(df1, df2, ~ case_when(.x < 0.5 ~  vector, TRUE~ .y))