让我们说:
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
,而定制函数可以解决这个问题,但我无法弄清楚。预先感谢您的解决方案。
答案 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))