从数据帧 R 获取矩阵

发布于 2025-01-11 14:59:28 字数 316 浏览 0 评论 0原文

我正在研究聚类,我需要在矩阵中转换我的数据。 这是我的 df:

       el1 el2 value
    1   a   x     1
    2   a   y     2
    3   a   z     3
    2   b   x     2
    3   b   y     3
    3   b   z     3

我需要将其转换为矩阵,将 el1 和 el2 作为行和列名称以及相应的值。

  x y z 
a 1 2 3
b 2 3 3

我该怎么办?谢谢!

I'm working on clustering and I need to tranform my data in matrix.
This is my df:

       el1 el2 value
    1   a   x     1
    2   a   y     2
    3   a   z     3
    2   b   x     2
    3   b   y     3
    3   b   z     3

I need to transform it in matrix, having el1 and el2 as rows and cols names and the corresponding value.

  x y z 
a 1 2 3
b 2 3 3

How I can do? Thanks!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

朦胧时间 2025-01-18 14:59:28

使用 reshape2 和一些魔法(我创建了自己的数据)

df=read.table(text="
el1 el2 value
a   w     1
a   x     2
a   y     3
a   z     4
b   x     1
b   y     2
b   z     3
c   y     1
c   z     2
d   z     1",h=T)

,那么

library(reshape2)
df2=dcast(
  df,
  el1~el2,
  value.var="value"
)
rownames(df2)=df2$el1
df2=subset(df2,select=-c(el1))

   w  x  y z
a  1  2  3 4
b NA  1  2 3
c NA NA  1 2
d NA NA NA 1

如果您的原始数据仅包含矩阵的上三角形或下三角形的数据,那么您可以复制另一个

df2[lower.tri(df2)]=t(df2)[lower.tri(df2)]

Using reshape2 and some magic (I created my own data)

df=read.table(text="
el1 el2 value
a   w     1
a   x     2
a   y     3
a   z     4
b   x     1
b   y     2
b   z     3
c   y     1
c   z     2
d   z     1",h=T)

then

library(reshape2)
df2=dcast(
  df,
  el1~el2,
  value.var="value"
)
rownames(df2)=df2$el1
df2=subset(df2,select=-c(el1))

   w  x  y z
a  1  2  3 4
b NA  1  2 3
c NA NA  1 2
d NA NA NA 1

if your original data only contains data for the upper or lower triangle of a matrix then you can copy the other with

df2[lower.tri(df2)]=t(df2)[lower.tri(df2)]
淡写薰衣草的香 2025-01-18 14:59:28

使用“xtabs”的基本 R 选项

> xtabs(value ~ ., df)
   el2
el1 x y z
  a 1 2 3
  b 2 3 3

A base R option using ´xtabs`

> xtabs(value ~ ., df)
   el2
el1 x y z
  a 1 2 3
  b 2 3 3
羁绊已千年 2025-01-18 14:59:28

这是一个基于 tidyrpivot_wider 函数的解决方案:

library(dplyr)
library(magrittr)
library(tidyr)

res <- df %>% 
  pivot_wider(
    id_cols = el1,
    names_from = el2,
    values_from = value) %>% 
  data.frame()

rownames(res) <- res$el1

(res %<>% select(-el1))

  x y z
a 1 2 3
b 2 3 3

它需要一些工作,因为 tibbles 不喜欢行名称。

Here is a solution based on tidyr's pivot_wider function:

library(dplyr)
library(magrittr)
library(tidyr)

res <- df %>% 
  pivot_wider(
    id_cols = el1,
    names_from = el2,
    values_from = value) %>% 
  data.frame()

rownames(res) <- res$el1

(res %<>% select(-el1))

  x y z
a 1 2 3
b 2 3 3

It needs a little bit of work because tibbles do not like row names.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文