楼主: xkdog
12547 15

[问答] 如何利用reshape2包中的cast()函数把数据转为宽格式? [推广有奖]

  • 7关注
  • 21粉丝

教师

已卖:2409份资源

副教授

67%

还不是VIP/贵宾

-

威望
0
论坛币
9731 个
通用积分
29.3654
学术水平
56 点
热心指数
57 点
信用等级
30 点
经验
27071 点
帖子
565
精华
0
在线时间
979 小时
注册时间
2005-11-27
最后登录
2024-11-26

楼主
xkdog 发表于 2015-12-24 00:06:39 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
用reshape2包中的cast()函数,把长数据转为宽数据时,有点不知所措。

以R自带的cholesterol数据为例,它本身应当是一个molten的数据,即长数据,形式如下:
  1.    trt response
  2. 1 1time   3.8612
  3. 2 1time  10.3868
  4. 3 1time   5.9059
  5. 4 1time   3.0609
  6. 5 1time   7.7204
  7. 6 1time   2.7139
复制代码

trt总共有5个水平,1time, 2times, 4times, drugD, drugE,每个水平下都是10个观测(response)。

现在,我想把它变成宽格式,即如下形式:

1time2times4timesdrugDdrugE

3.8612

10.3993

13.9621

16.9819

21.5119

10.3868

8.6027

13.9606

15.4576

27.2445

…………………………


用cast()做了几次,都没有成功,看文档,也不是很明白,请教各位达人,谢!


二维码

扫码加我 拉你入群

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

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

关键词:reshape Shape CAS APE RES 如何

回帖推荐

蓝色 发表于9楼  查看完整内容

suimong 发表于2楼  查看完整内容

对于一个只有两列的数据,其中必然只有1列是variable,1列是value。cast的本质是把一个一维的表变成二维的表,即行和列都是由某一列variable展开的,因此当你在cast的时候你必须提供两个variable,给列的是trt,给行的则是你每一组的observation的个数。简单粗暴的话你可以这么写:这和你要的结果相比多了一列,那是因为你要的结果不是一个标准的二维表,而是把行的变量给“隐藏”到行名里去了。 想要直接在cast的时候重命名的话也 ...

本帖被以下文库推荐

沙发
suimong 发表于 2015-12-24 15:12:07
对于一个只有两列的数据,其中必然只有1列是variable,1列是value。cast的本质是把一个一维的表变成二维的表,即行和列都是由某一列variable展开的,因此当你在cast的时候你必须提供两个variable,给列的是trt,给行的则是你每一组的observation的个数。简单粗暴的话你可以这么写:
  1. library(reshape2)
  2. dcast(cholesterol, c(1:10) ~ trt)
复制代码
这和你要的结果相比多了一列,那是因为你要的结果不是一个标准的二维表,而是把行的变量给“隐藏”到行名里去了。
想要直接在cast的时候重命名的话也很简单:
  1. library(reshape2)
复制代码
已有 1 人评分经验 收起 理由
李会超 + 80 精彩帖子

总评分: 经验 + 80   查看全部评分

藤椅
xkdog 发表于 2015-12-24 21:54:08
suimong 发表于 2015-12-24 15:12
对于一个只有两列的数据,其中必然只有1列是variable,1列是value。cast的本质是把一个一维的表变成二维的表 ...
谢谢提醒!

第一段命令能实现,但是第二个命令就有问题了,具体如下:
  1. dcast(cholesterol, list(.(obs = c(1:10)), .(trt)))
  2. Error in inherits(x, "formula") : could not find function "."
复制代码
请问这是怎么回事?我是win7+R 3.2.2
另外,如果每个处理组中的观测数不等,又应当如何cast呢?谢谢!

板凳
suimong 发表于 2015-12-25 00:04:27
xkdog 发表于 2015-12-24 21:54
谢谢提醒!

第一段命令能实现,但是第二个命令就有问题了,具体如下:请问这是怎么回事?我是win7+R 3 ...
抱歉,应该要加上library(plyr). plyr 和reshape2两个包经常搭配着一起用。
嗯,那么如果是组数不一样的话那就需要我们分组生成从1开始的序列了。用plyr可以这么写:
  1. library(plyr)
  2. df <- cholesterol
  3. df <- ddply(df, .(trt), mutate, obs = seq_len(length(response)))

  4. dcast(df, obs ~ trt, value.var = "response")
复制代码
这里需要添加value.var是因为dcast默认猜错了作为value的列,所以要手动指定一下。
已有 1 人评分经验 学术水平 热心指数 信用等级 收起 理由
xkdog + 10 + 5 + 5 + 5 精彩帖子

总评分: 经验 + 10  学术水平 + 5  热心指数 + 5  信用等级 + 5   查看全部评分

报纸
cheetahfly 在职认证  发表于 2015-12-25 09:46:24
你想要得到的那个表是不太符合R的统计思想的,这是为什么你变换起来这么费劲的原因。
在你的目标表中,同一行的不同数字之间没有内在联系,事实上,每一列中不同数字顺序是可以变换的。这与R语言认为每一行是一个“观测”的思想是不符的。

建议解决方法:
如果数据之间有其他的内在联系,就加多一列;如果没有,就拆成5个向量,而不是生硬地将这5个向量一定要装在一个数据框中,这样也解决了观测数不等的问题。

地板
xkdog 发表于 2015-12-25 10:38:22
suimong 发表于 2015-12-25 00:04
抱歉,应该要加上library(plyr). plyr 和reshape2两个包经常搭配着一起用。
嗯,那么如果是组数不一样的 ...
好的,非常感谢哈!

7
xkdog 发表于 2015-12-25 10:44:38
cheetahfly 发表于 2015-12-25 09:46
你想要得到的那个表是不太符合R的统计思想的,这是为什么你变换起来这么费劲的原因。
在你的目标表中,同一 ...
谢谢提醒啊!

其实是这样,我并不想把这个数据通过这种变换做处理,而只是想把这个长数据转化为宽形式后,可以把数据本身用我们更常见的模式呈现出来,做成一个表格,放在讲义中,以便理解。如果是为了分析,自然是长格式要好。只是不知道如何对观测数不等的实验数据,如何用R做成常见的表格形式。

8
cheetahfly 在职认证  发表于 2015-12-25 15:53:14
xkdog 发表于 2015-12-25 10:44
谢谢提醒啊!

其实是这样,我并不想把这个数据通过这种变换做处理,而只是想把这个长数据转化为宽形式 ...
如果仅用于表格展示的话,Excel的数据透视表会更加方便一些。

9
蓝色 发表于 2015-12-25 16:09:05
  1. rm(list=ls())
  2. library(multcomp)
  3. data(cholesterol)
  4. cholesterol

  5. cholesterol  <- within(cholesterol,{id <- seq(from=1, to = 10, by =1)})

  6. wide <- reshape(cholesterol, idvar = "id", v.name = c("response"),
  7.                 timevar = "trt", direction = "wide")
  8. wide
复制代码

  1. cholesterol  <- within(cholesterol,{id <- seq(from=1, to = 10, by =1)})
  2. >
  3. > wide <- reshape(cholesterol, idvar = "id", v.name = c("response"),
  4. +                 timevar = "trt", direction = "wide")
  5. > wide
  6.    id response.1time response.2times response.4times response.drugD response.drugE
  7. 1   1         3.8612         10.3993         13.9621        16.9819        21.5119
  8. 2   2        10.3868          8.6027         13.9606        15.4576        27.2445
  9. 3   3         5.9059         13.6320         13.9176        19.9793        20.5199
  10. 4   4         3.0609          3.5054          8.0534        14.7389        15.7707
  11. 5   5         7.7204          7.7703         11.0432        13.5850        22.8850
  12. 6   6         2.7139          8.6266         12.3692        10.8648        23.9527
  13. 7   7         4.9243          9.2274         10.3921        17.5897        21.5925
  14. 8   8         2.3039          6.3159          9.0286         8.8194        18.3058
  15. 9   9         7.5301         15.8258         12.8416        17.9635        20.3851
  16. 10 10         9.4123          8.3443         18.1794        17.6316        17.3071
  17. >
复制代码


已有 1 人评分经验 学术水平 热心指数 信用等级 收起 理由
xkdog + 10 + 5 + 5 + 5 精彩帖子

总评分: 经验 + 10  学术水平 + 5  热心指数 + 5  信用等级 + 5   查看全部评分

10
xkdog 发表于 2015-12-25 23:12:07
cheetahfly 发表于 2015-12-25 15:53
如果仅用于表格展示的话,Excel的数据透视表会更加方便一些。
嗯,有道理

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-24 04:50