全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 R语言论坛
12377 15
2015-12-24
用reshape2包中的cast()函数,把长数据转为宽数据时,有点不知所措。

以R自带的cholesterol数据为例,它本身应当是一个molten的数据,即长数据,形式如下:
复制代码

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()做了几次,都没有成功,看文档,也不是很明白,请教各位达人,谢!


二维码

扫码加我 拉你入群

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

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

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

扫码加我 拉你入群

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

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

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

第一段命令能实现,但是第二个命令就有问题了,具体如下:
复制代码
请问这是怎么回事?我是win7+R 3.2.2
另外,如果每个处理组中的观测数不等,又应当如何cast呢?谢谢!
二维码

扫码加我 拉你入群

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

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

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

第一段命令能实现,但是第二个命令就有问题了,具体如下:请问这是怎么回事?我是win7+R 3 ...
抱歉,应该要加上library(plyr). plyr 和reshape2两个包经常搭配着一起用。
嗯,那么如果是组数不一样的话那就需要我们分组生成从1开始的序列了。用plyr可以这么写:
复制代码
这里需要添加value.var是因为dcast默认猜错了作为value的列,所以要手动指定一下。
二维码

扫码加我 拉你入群

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

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

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

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

扫码加我 拉你入群

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

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

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

扫码加我 拉你入群

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

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

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群