我有一個包含 4 列的資料框。
set.seed(123)
df <- data.frame(A = round(rnorm(1000, mean = 1)),
B = rpois(1000, lambda = 3),
C = round(rnorm(1000, mean = -1)),
D = round(rnorm(1000, mean = 0)))
我想在我的資料幀的每一行計算我的列(AB、AC、AD、BC、BD、CD)的每個可能組合的距離。這相當于df$A - df$B
對每個組合都做。
dist()
由于我有一個非常大的資料集,我們可以使用該函式有效地計算它嗎?然后我想將 dist 物件轉換為 adata.frame
以繪制結果ggplot2
。
除非有tidy
執行上述操作的好版本。
非常感謝
我得到的最接近的是執行以下操作,但我不確定列名指的是什么。
d <- apply(as.matrix(df), 1, function(e) as.vector(dist(e)))
t(d)
uj5u.com熱心網友回復:
使用基數 r:
df_dist <- t(apply(df, 1, dist))
colnames(df_dist) <- apply(combn(names(df), 2), 2, paste0, collapse = "_")
如果您真的想使用整潔的方法,您可以使用c_across
,但這也會洗掉名稱,并且如果您的資料很大,則速度會慢得多
uj5u.com熱心網友回復:
dist
會將向量中的每個值與同一向量中的每個其他值進行比較,因此如果您要逐行比較列,這不是您要查找的。
如果您只想成對計算所有列之間的差異,您可以執行以下操作:
df <- cbind(df,
do.call(cbind, lapply(asplit(combn(names(df), 2), 2), function(x) {
setNames(data.frame(df[x[1]] - df[x[2]]), paste(x, collapse = ""))
})))
head(df)
#> A B C D AB AC AD BC BD CD
#> 1 0 1 -2 -1 -1 2 1 3 2 -1
#> 2 1 1 -1 1 0 2 0 2 0 -2
#> 3 3 1 -2 -1 2 5 4 3 2 -1
#> 4 1 3 0 -1 -2 1 2 3 4 1
#> 5 1 3 0 1 -2 1 0 3 2 -1
#> 6 3 3 1 0 0 2 3 2 3 1
由reprex 包于 2022-06-14 創建(v2.0.1)
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/491403.html