簡體   English   中英

R Dataframe 創建一個新的列組合行和列名

[英]R Dataframe make a new column combining row and column names

我有一個相似性矩陣 (SimMat),通過將其寫為 .csv 並將其重新讀取到環境中,我已將其轉換為數據幀。

   A    B   C
A  1   0.3 0.7   
B 0.3   1  0.5   
C 0.7  0.5  1  

我想改變這一點,以便我有一個數據框,詳細說明如下獨特的比較和值:

Comp  Val
A-A    1
A-B   0.3
A-C   0.7
B-B    1 
B-C   0.5
C-C    1

有誰知道我怎么能做到這一點?

一種不使用任何軟件包的選項

transform(as.data.frame.table(m1), Comp = 
       paste(Var1, Var2, sep="-"), Val = Freq)[c("Comp", "Val")]
#  Comp Val
#1  A-A 1.0
#2  B-A 0.3
#3  C-A 0.7
#4  A-B 0.3
#5  B-B 1.0
#6  C-B 0.5
#7  A-C 0.7
#8  B-C 0.5
#9  C-C 1.0

或者只是復制dimnames並使用c將矩陣轉換為向量

data.frame(Comp = paste(row.names(m1)[row(m1)],
              colnames(m1)[col(m1)], sep= '-'), Val = c(m1))

如果我們只有lower.tri角值

Val <- m1[lower.tri(m1, diag = TRUE)]
Comp <- paste(row.names(m1)[col(m1)],
              colnames(m1)[row(m1)], sep= '-')[lower.tri(m1, diag = TRUE)]
data.frame(Comp, Val)
#  Comp Val
#1  A-A 1.0
#2  A-B 0.3
#3  A-C 0.7
#4  B-B 1.0
#5  B-C 0.5
#6  C-C 1.0

或者使用tidyverse

library(dplyr)
library(tidyr)
as.data.frame.table(m1) %>%
     unite(Comp, Var1, Var2, sep='-')
#  Comp Freq
#1  A-A  1.0
#2  B-A  0.3
#3  C-A  0.7
#4  A-B  0.3
#5  B-B  1.0
#6  C-B  0.5
#7  A-C  0.7
#8  B-C  0.5
#9  C-C  1.0

或者用melt

library(data.table)
setDT(melt(m1))[, Comp := paste(Var1, Var2, sep="-")]

數據

m1 <- structure(c(1, 0.3, 0.7, 0.3, 1, 0.5, 0.7, 0.5, 1), .Dim = c(3L, 
3L), .Dimnames = list(c("A", "B", "C"), c("A", "B", "C")))

使用tidyverse ,我們可以將行名作為新列,以長格式獲取數據並組合數據的行名和列名。

library(tidyverse)

df %>%
  #If it is a matrix convert to dataframe
  #as.data.frame() %>%
  rownames_to_column() %>%
  pivot_longer(cols = -rowname) %>%
  unite(name, rowname, name, sep = "-")

#  name  value
#  <chr> <dbl>
#1 A-A     1  
#2 A-B     0.3
#3 A-C     0.7
#4 B-A     0.3
#5 B-B     1  
#6 B-C     0.5
#7 C-A     0.7
#8 C-B     0.5
#9 C-C     1  

要僅獲取唯一值,我們可以使用pminpmax

df %>%
  #as.data.frame() %>%
  rownames_to_column() %>%
  pivot_longer(cols = -rowname) %>%
  mutate(newcol1 = pmin(rowname, name), newcol2 = pmax(rowname, name)) %>%
  select(-rowname, -name) %>%
  distinct() %>%
  unite(Comp, newcol1, newcol2, sep = "-")

數據

df <- structure(list(A = c(1, 0.3, 0.7), B = c(0.3, 1, 0.5), C = c(0.7, 
0.5, 1)), class = "data.frame", row.names = c("A", "B", "C"))

暫無
暫無

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

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