我有一个data.frame,如下所示,其中 location
是一个因子, sample
是一些测量样本:
location sample
1 'A' 0.10
2 'A' 0.20
3 'A' 0.15
4 'B' 0.15
5 'B' 0.99
6 'B' 0.54
...
我有一个函数 ECCDFpts(df)
,其中 df
是一个data.frame,它在 df$sample
的经验CCDF上返回一组 <x,y>
点,如下所示:
x y
1 0.0 1.00
2 0.1 0.99
3 0.2 0.75
...
请注意,返回的 <x,y>
点数为"arbitrary" . 输入样本和输出 <x,y>
行之间没有一对一的映射 .
我想在每个因素(例如,位置)的基础上计算这个CCDF数据,产生这样的data.frame:
location x y
1 'A' 0.0 1.0
2 'A' 0.1 1.0
3 'A' 0.2 0.3
4 'B' 0.0 1.0
5 'B' 0.1 1.0
6 'B' 0.2 0.7
...
我目前的方法是将初始数据帧拆分为因子 location
:
eccdfs_by_factor <- by(data, data$location, ECCDFpts)
这会生成data.frames列表:
data$location: A
x y
1 0.0 1.0
2 0.1 1.0
3 0.2 0.3
-----------------
data$location: B
x y
1 0.0 1.0
2 0.1 1.0
3 0.2 0.7
我不知道如何将这个合并或取消拆分回我想要的形式,如前所示 . 我想合并,使列表中的元素名称(data.frames)成为组合data.frame中的列因子 .
Solution:
显然,这是一个典型的分裂 - 应用 - 组合问题 . 最干净的solutions below使用 plyr
包函数 ddply(...)
在一行中进行拆分,应用和组合!我不需要上面使用的基本 by
功能 .
3 回答
一次性解决方案使用
plyr
包 . 由于我不知道您的ECDFpts功能,我将自己编写以说明其用法 .编辑 . 正如@David在评论中所指出的那样,代码可以进一步简化为
更新:如果我理解你想要的正确...
例如:
答案你想要添加一个解决方案,解释如何从
by
命令的输出开始获得所需的结果 . 我是_2450462的例子:您正在按
location
分割数据并使用by
应用您的函数:现在,一个非常方便的事情是,我们可以使用
do.call
和rbind
将所有内容重新组合在一起:但等等,你说!添加我的位置列怎么样?那么,请注意
do.call(rbind,rs)
对结果的行名称做了什么!我们可以通过从行名中提取第一个字符来添加位置列:当然,这假定您的位置使用单个字符进行编码 . 但通常,生成的行名称应采用
location.x
形式,因此您可以始终使用strsplit
或正则表达式来提取位置名称 .最后,您可以随时简单地修改应用于每个部分的函数,以在返回结果之前将位置名称添加为列,如下所示:
所以你只需要以类似的方式修改
ECCDFpts
函数 .