簡體   English   中英

如何將 dataframe 轉換為組合矩陣

[英]How to transform a dataframe into a matrix of combinations

我有一行的數據框,其中包含兩個變量的方程的結果(我們稱它們為 X 和 Y;為簡單起見,方程是一個總和)。 我需要將 dataframe 轉換為一個矩陣,我可以在其中看到這些變量的組合。 這是一個可重現的例子:

x1_y1 <- 2 #Here x = 1, y = 1
x1_y2 <- 3 #Here x = 1, y = 2
x2_y1 <- 3 #Here x = 2, y = 1
x2_y2 <- 4 #Here x = 2, y = 2

df <- data.frame(x1_y1, x1_y2, x2_y1, x2_y2)

我希望 output 是這樣的:

在此處輸入圖像描述

有誰知道如何實現這一目標? 提前致謝!

通過strcapture提取名稱組件后的tapply嘗試:

tapply(unlist(df), strcapture("(.+)_(.+)", names(df), proto=list(x="",y="")), I)
#    y
#x    y1 y2
#  x1  2  3
#  x2  3  4

這有效...

底座 R

(類似於 thelatemail 的答案,雖然略有不同......同時寫的:-)

tmp <- cbind(strcapture("(.+)_(.+)", names(df), list(x="", y="")), val = unlist(df, use.names = FALSE))
tmp <- reshape2::dcast(x ~ y, value.var = "val", data = tmp)
rownames(tmp) <- tmp[[1]]
tmp <- tmp[,-1]
as.matrix(tmp)
#    y1 y2
# x1  2  3
# x2  3  4

dplyr

可能有點做作...

library(dplyr)
library(tidyr)
tmp <- df %>%
  pivot_longer(everything()) %>%
  separate(name, sep = "_", into = c("x", "y")) %>%
  pivot_wider(x, names_from = "y", values_from = "value") %>%
  as.data.frame()
rownames(tmp) <- tmp[[1]]
tmp <- tmp[,-1]
as.matrix(tmp)
#    y1 y2
# x1  2  3
# x2  3  4

一個tidyr的解決方案:

library(tidyr)

df %>%
  pivot_longer(everything(), names_to = c("x", ".value"), names_sep = "_") %>%
  tibble::column_to_rownames("x")

#    y1 y2
# x1  2  3
# x2  3  4

output 仍然是一個數據幀。 如有必要,您可以將其傳遞給as.matrix()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM