楼主: xkdog
12509 15

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

11
xkdog 发表于 2015-12-25 23:14:18
蓝色 发表于 2015-12-25 16:09
这个厉害了!大赞!

12
cheetahfly 在职认证  发表于 2015-12-26 22:34:19
看着各位大神在数据框变换的道路上越走越远,越走越顺,在佩服各位对函数的运用之熟练之余,不禁有些话想说。
大家先看我如何实现的:
  1.     > as.data.frame(split(cholesterol[,2], cholesterol[,1]))
  2.         X1time X2times X4times   drugD   drugE
  3.     1   3.8612 10.3993 13.9621 16.9819 21.5119
  4.     2  10.3868  8.6027 13.9606 15.4576 27.2445
  5.     3   5.9059 13.6320 13.9176 19.9793 20.5199
  6.     4   3.0609  3.5054  8.0534 14.7389 15.7707
  7.     5   7.7204  7.7703 11.0432 13.5850 22.8850
  8.     6   2.7139  8.6266 12.3692 10.8648 23.9527
  9.     7   4.9243  9.2274 10.3921 17.5897 21.5925
  10.     8   2.3039  6.3159  9.0286  8.8194 18.3058
  11.     9   7.5301 15.8258 12.8416 17.9635 20.3851
  12.     10  9.4123  8.3443 18.1794 17.6316 17.3071
复制代码
挺简单,是吧?因为我从头就没有考虑数据框变换的问题。

就像我在第5楼所提醒楼主的,严格来说,目标“表格”不是统计意义上的二维数据框,而是一个一维向量的“分割展示”。所以,楼主所提出的问题不是数据框变换的问题,而是一个“向量分割”的问题,中间自然而然出现了“降维”。为什么会这样?因为原数据框只有两个变量,抽取其中一个变量作为“归类”条件后,剩下一个变量是无法支撑起一个数据框。从另外一个角度说, 目标“表格”的列代表不同“trt”属性,而目标表格的行不具备任何意义。

故而,用向量划分的普通函数——split()很容易就解决了这个问题。而不需要像数据框变形的解决思路那样,一定需要引入一个“无统计意义”的新变量,无论是“obs”还是“id”。

但是,我要再次劝楼主不要用这样的二维表,尤其是在传授知识时,因为不严谨,这样的二维表容易“暗示”不存在的逻辑联系,且无法解决各分类别向量长度不相等时的问题。那应该如何呢?我建议用list的形式,比如,split()函数的直接处理结果如下:
split1.PNG
这就是用list的形式组装了对原向量切割后的结果,这样的逻辑非常清晰和严谨,各个子向量相互独立,不会引起误会。而且当各子向量长度不一致时,也不会存在任何问题,比如:
split2.PNG

最后,再吐槽一下,本论坛输入“美元符号”真的有可能会带来排版上的灾难性结果。
已有 3 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
admin_kefu + 20 热心帮助其他会员
xkdog + 50 + 5 + 5 + 5 精彩帖子
suimong + 5 + 5 + 5 精彩帖子

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

13
蓝色 发表于 2015-12-27 09:17:04
cheetahfly 发表于 2015-12-26 22:34
看着各位大神在数据框变换的道路上越走越远,越走越顺,在佩服各位对函数的运用之熟练之余,不禁有些话想说 ...
split不错,思路是很清晰,又学了一个。  我这是初学R,许多命令不知道该怎么用。(一般都是把宽的数据变成长的数据)
假如数据是 长数据
region   year    gdp     pop
a        2011    29.0          21.3
a        2012    17.0           8.0
a        2013    23.6           3.7
b        2011     7.4          11.6
b        2012    12.5          14.5
b        2013     5.4          10.5


想变成:宽数据
  region  gdp2011  pop2011  gdp2012  pop2012  gdp2013  pop2013
     a        29.0          21.3          17.0           8.0            23.6          3.7
     b        7.4           11.6          12.5           14.5           5.4           10.5


用split是可以实现,但前面的region 就缺失了,有什么简便的方法吗?谢谢。
(用reshape是没有问题的)


14
xkdog 发表于 2015-12-27 14:32:05
cheetahfly 发表于 2015-12-26 22:34
看着各位大神在数据框变换的道路上越走越远,越走越顺,在佩服各位对函数的运用之熟练之余,不禁有些话想说 ...
这个思路很赞。

本来遇到这个例子,是在说明方差分析的操作中。因为要把它做成通常的表格形式,一开始自己想的方式,就是使用reshape包。另外,检验方差分析的条件时,需要对各处理组的数据是否服从正态分布一一作出检验,所以想把长格式换为宽格式,然后对之进行处理。这样的话,用split其实是更符合自己思路的方式。

感觉这个帖子的一系列回贴,都很有水平啊!强赞!

15
待琢璞玉 学生认证  发表于 2016-12-20 00:05:44

16
一入统计深似海 发表于 2017-1-15 11:26:24
太赞!学到了很多,谢谢分享~

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-31 13:56