【问题标题】:Loop to create dummies out of two df R循环从两个 df R 中创建假人
【发布时间】:2021-12-08 09:46:30
【问题描述】:

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

我有两个 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

我想要做的是创建一个循环,为每个变量向 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.

【问题讨论】:

    标签: r dataframe loops


    【解决方案1】:

    我们可以使用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"))
    

    【讨论】:

    • @NicolásRojasU 不过不清楚。我假设您在 DF2 中的行名是“T01”、“T02”等。
    • 我再次测试,它对我来说工作正常
    • @NicolásRojasU 使用我帖子中的数据进行测试,看看您是否仍然遇到错误。我猜您的数据可能没有 DF2 的行名或缺少其他内容
    • @NicolásRojasU 您也可以使用for 循环。如果你想要,我可以添加它
    • @NicolásRojasU 我已经用for循环更新了
    猜你喜欢
    • 2020-10-09
    • 1970-01-01
    • 2016-10-29
    • 1970-01-01
    • 2022-12-03
    • 2016-05-10
    • 2021-07-25
    • 2012-07-19
    • 2019-01-14
    相关资源
    最近更新 更多