我目前正在嘗試在資料框的兩列之間找到唯一元素,并將它們寫入新的最終資料框。這是我的代碼,它作業得很好,并創建了符合我期望的結果。
set.seed(42)
df <- data.frame(a = sample(1:15, 10),
b=sample(1:15, 10))
unique_to_a <- df$a[!(df$a %in% df$b)]
unique_to_b <- df$b[!(df$b %in% df$a)]
n <- max(c(unique_to_a, unique_to_b))
out <- data.frame(A=rep(NA,n), B=rep(NA,n))
for (element in unique_to_a){
out[element, "A"] = element
}
for (element in unique_to_b){
out[element, "B"] = element
}
out
問題是,它非常慢,因為實際資料包含 100.000 行。我很確定這是因為我在 for 回圈中進行了重復索引,并且我確定有一種更快的矢量化方式,但我沒有看到......
非常感謝有關如何加快操作速度的任何想法。干杯!
uj5u.com熱心網友回復:
沒有比較速度,但至少這更簡潔:
elements <- with(df, list(setdiff(a, b), setdiff(b, a)))
data.frame(sapply(elements, \(x) replace(rep(NA, max(unlist(elements))), x, x)))
# X1 X2
# 1 NA NA
# 2 NA NA
# 3 NA 3
# 4 NA NA
# 5 NA NA
# 6 NA NA
# 7 NA NA
# 8 NA NA
# 9 NA NA
# 10 NA NA
# 11 11 NA
uj5u.com熱心網友回復:
請在此處找到該data.table軟體包的解決方案。
正品
- 代碼
library(data.table)
# 1. Use all the cores of the processor to optimize the processing time
setDTthreads(threads = 0)
getDTthreads() # in my case, the processor has 4 threads
#> [1] 4
# 2. Code to find unique element between the two columns
setDT(df)[,.(A = fifelse(a %in% b, NA_integer_, a), B = fifelse(b %in% a, NA_integer_, b))]
- 輸出
#> A B
#> 1: NA NA
#> 2: NA NA
#> 3: NA NA
#> 4: NA NA
#> 5: NA NA
#> 6: NA 3
#> 7: NA NA
#> 8: NA NA
#> 9: NA NA
#> 10: 11 NA
由reprex 包(v0.3.0)于 2021 年 10 月 29 日創建
PS:在與@sindri_baldur(cf.below)的交流之后,我給你原始的dataframe“df”,因為它是在我的電腦上用 R 4.0.2 生成的(如你所見,數字 3 位于列的第六行b 而不是第 3 行;這說明在上面的輸出中,數字 3 位于第 6 行而不是第 3 行)
set.seed(42)
df <- data.frame(a = sample(1:15, 10),
b=sample(1:15, 10))
df
#> a b
#> 1 1 9
#> 2 5 5
#> 3 15 4
#> 4 9 10
#> 5 10 2
#> 6 4 3
#> 7 2 15
#> 8 12 1
#> 9 13 12
#> 10 11 13
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/341297.html
上一篇:R中分類變數的可視化
