循环从两个df r中创建假人



为了便于解释,我将使用一个较小的示例。

我有两个DF:

DF1:  T01  T02  T03  T04  T05
1   15   20   48   25   5
2   12   18   35   30   12
3   13   15   50   60   42
DF2:   MEDIAN  SD
T01   13      1.24 
T02   18      2.05
T03   45      6.64
T04   30      15.45
T05   12      16.04

我想做的是创建一个循环,为每个变量添加一个dummy到DF1,如果DF1$T01≈(几乎等于)DF2$MEDIAN[1],则取值1,如果不是,则取值0,然后转到T02, T03,直到它中断。

直到现在,我还没有能够创建一个循环(我并不擅长创建循环),使这个。我确实设法为其中一个变量(T01)制作了假人,但在实际的DF中,我有超过40个变量,所以手工制作它根本没有效率。我现在的是:

DF1$dummyt01 <- ifelse(almost.equal(DF1$T01, DF2$MEDIAN[1], tolerance = 2),1,0)

结果预期:

DF1:  T01  T02  T03  T04  T05 dummyT01 dummyT02 ... dummyT05
1   15   20   48   25   5   1          1      ...   0
2   12   18   35   30   12  1          1      ...   1
3   13   15   50   60   42  1          0      ...   0
Note: Not a native english speaker. Sorry for any mistakes.
EDIT: Expected Outcome.

我们可以使用tidyverse。循环across'DF1'的列,获得该列的列名循环(cur_column()),使用它来子集'DF2'(作为行名)'MEDIAN'元素,与almost.equal进行比较以返回一个逻辑向量,该向量与as.integer+强制转换为二进制。在.names中添加前缀'dummy',以便创建新列

library(dplyr)
library(berryFunctions)
DF1 <- DF1 %>%
mutate(across(everything(), ~ +(almost.equal(.,  
DF2[cur_column(), "MEDIAN"], tolerance = 1)),
.names = "dummy{.col}"))

与产出

DF1
T01 T02 T03 T04 T05 dummyT01 dummyT02 dummyT03 dummyT04 dummyT05
1  15  20  48  25   5        0        0        0        0        0
2  12  18  35  30  12        1        1        0        1        1
3  13  15  50  60  42        1        0        0        0        0

或者使用for循环

for(i in seq_along(DF1))
DF1[paste0('dummy', names(DF1)[i])] <- +(almost.equal(DF1[[i]], 
DF2[names(DF1)[i], "MEDIAN"], tolerance = 1))

数据
DF1 <- structure(list(T01 = c(15L, 12L, 13L), T02 = c(20L, 18L, 15L), 
T03 = c(48L, 35L, 50L), T04 = c(25L, 30L, 60L), T05 = c(5L, 
12L, 42L)), class = "data.frame", row.names = c("1", "2", 
"3"))
DF2 <- structure(list(MEDIAN = c(13L, 18L, 45L, 30L, 12L), SD = c(1.24, 
2.05, 6.64, 15.45, 16.04)), class = "data.frame", row.names = c("T01", 
"T02", "T03", "T04", "T05"))

最新更新