楼主: zzbb2266
1978 6

[问答] Reshape2逐个展开数据框的问题 [推广有奖]

  • 0关注
  • 0粉丝

大专生

41%

还不是VIP/贵宾

-

威望
0
论坛币
13 个
通用积分
1.0179
学术水平
2 点
热心指数
2 点
信用等级
0 点
经验
227 点
帖子
25
精华
0
在线时间
67 小时
注册时间
2018-9-11
最后登录
2020-4-17

楼主
zzbb2266 发表于 2018-10-23 14:35:19 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
求助,现在有一个数据框:
  1.         A        B        C        D        E        F        G
  2. A        1        -0.060716224        0.012778079        -0.133301682        0.454164406        -0.150094954        0.360689094
  3. B        -0.060716224        1        0.523955507        0.68814433        -0.38178242        0.603160608        0.315056972
  4. C        0.012778079        0.523955507        1        0.334413999        -0.48175529        0.486502984        0.106673901
  5. D        -0.133301682        0.68814433        0.334413999        1        -0.314975583        0.711326641        0.360784048
  6. E        0.454164406        -0.38178242        -0.48175529        -0.314975583        1        -0.38562127        0.099986435
  7. F        -0.150094954        0.603160608        0.486502984        0.711326641        -0.38562127        1        0.246758003
  8. G        0.360689094        0.315056972        0.106673901        0.360784048        0.099986435        0.246758003        1
复制代码
想要按行列逐个展开为一个新的3列数据框,第一列为对应行名,第二列为对应列名,第三列为数值:
  1. From  To    Value
  2. A       A          1
  3. A       B       -0.06072
  4. A       C      0.012778
  5. ......
复制代码
使用reshape2的melt函数展开后只能得到Value值的单列
  1. frame11 <- melt(data = as.numeric(as.matrix(M)),id.vars = c(row.names(M),colnames(M)))
复制代码
求问如果想获得像上图那种三列数据框该怎么做?求指点
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝


回帖推荐

ryoeng 发表于5楼  查看完整内容

> read.table('read.txt') %>% melt(data = as.numeric(as.matrix(.)),id.vars = c(row.names(.),colnames(.))) %>% tbl_df > read.table('read.txt') %>% tidyr::gather() %>% tbl_df

沙发
啊啊啊啊啊吖 发表于 2018-10-31 10:39:55
求热心坛友解答

藤椅
zzbb2266 发表于 2018-11-13 09:37:26
好吧标记一下,一个笨办法是手动展开循环:
  1. l1 <- rep(row.names(mc),each=1,len = length(row.names(mc))*length(row.names(mc)))
  2. l2 <- rep(row.names(mc),each = length(row.names(mc)))
  3. frame <- cbind(l1,l2,frame11) #frame11为melt结果
复制代码
另外通过直接插入行列名为新列,然后设定为melt的id.vars貌似也可以,但还没试过,期待更好方案

板凳
jgchen1966 发表于 2018-11-13 10:36:01
学习一下 tidyr::gather   
学会了,就很简单了。。

报纸
ryoeng 在职认证  发表于 2018-11-13 11:13:11
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽

地板
zzbb2266 发表于 2018-11-13 16:17:58
感谢!

7
zzbb2266 发表于 2018-11-13 17:11:54
ryoeng 发表于 2018-11-13 11:13
> read.table('read.txt') %>% melt(data = as.numeric(as.matrix(.)),id.vars = c(row.names(.),colnames( ...
试了一下这两个方法还是不太满意... 最后得出的结果希望是一个3列的表,如图: 1.png
而gather结果还是两列的,貌似不能直接载入行列名作为观测值:
1.png

melt也是一样,有什么更好的办法么?

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-2-7 14:25