[英]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
要僅獲取唯一值,我們可以使用pmin
和pmax
。
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.