看着各位大神在数据框变换的道路上越走越远,越走越顺,在佩服各位对函数的运用之熟练之余,不禁有些话想说。
大家先看我如何实现的:
- > as.data.frame(split(cholesterol[,2], cholesterol[,1]))
- X1time X2times X4times drugD drugE
- 1 3.8612 10.3993 13.9621 16.9819 21.5119
- 2 10.3868 8.6027 13.9606 15.4576 27.2445
- 3 5.9059 13.6320 13.9176 19.9793 20.5199
- 4 3.0609 3.5054 8.0534 14.7389 15.7707
- 5 7.7204 7.7703 11.0432 13.5850 22.8850
- 6 2.7139 8.6266 12.3692 10.8648 23.9527
- 7 4.9243 9.2274 10.3921 17.5897 21.5925
- 8 2.3039 6.3159 9.0286 8.8194 18.3058
- 9 7.5301 15.8258 12.8416 17.9635 20.3851
- 10 9.4123 8.3443 18.1794 17.6316 17.3071
复制代码挺简单,是吧?因为我从头就没有考虑数据框变换的问题。
就像我在第5楼所提醒楼主的,严格来说,目标“表格”不是统计意义上的二维数据框,而是一个一维向量的“分割展示”。所以,楼主所提出的问题不是数据框变换的问题,而是一个“向量分割”的问题,中间自然而然出现了“降维”。为什么会这样?因为原数据框只有两个变量,抽取其中一个变量作为“归类”条件后,剩下一个变量是无法支撑起一个数据框。从另外一个角度说, 目标“表格”的列代表不同“trt”属性,而目标表格的行不具备任何意义。
故而,用向量划分的普通函数——split()很容易就解决了这个问题。而不需要像数据框变形的解决思路那样,一定需要引入一个“无统计意义”的新变量,无论是“obs”还是“id”。
但是,我要再次劝楼主不要用这样的二维表,尤其是在传授知识时,因为不严谨,这样的二维表容易“暗示”不存在的逻辑联系,且无法解决各分类别向量长度不相等时的问题。那应该如何呢?我建议用list的形式,比如,split()函数的直接处理结果如下:
这就是用list的形式组装了对原向量切割后的结果,这样的逻辑非常清晰和严谨,各个子向量相互独立,不会引起误会。而且当各子向量长度不一致时,也不会存在任何问题,比如:
最后,再吐槽一下,本论坛输入“美元符号”真的有可能会带来排版上的灾难性结果。