為了更容易解釋,我將使用一個較小的例子。
我有兩個 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.
uj5u.com熱心網友回復:
我們可能會使用tidyverse. 回圈across'DF1' 的列,獲取回圈的該列的列名(cur_column()),使用它對 'DF2'(作為行名)'MEDIAN' 元素進行子集化,與 '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"))
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/329721.html
