根据相似的行值创建新列

Posted

技术标签:

【中文标题】根据相似的行值创建新列【英文标题】:Create new columns based on similar row values 【发布时间】:2014-11-03 13:20:44 【问题描述】:

如何根据匹配的行值创建一组新的数据框列? 例如,对于这个示例数据框:

x<-data.frame(cbind(numsp=rep(c(16,64,256),each=12),Colless=rep(c("loIc","midIc","hiIc"),each=4, times=3), lambdaE=rep(c(TRUE,FALSE),each=2,times=9),ntree=rep(c(1,2),length.out=36), metric1=seq(1:36), metric2=seq(1:36)))

对于某些参数,例如 lambdaE,我想根据 lambdaE 是 TRUE 还是 FALSE,为 metric1 和 metric 2 创建新列。 数据框看起来像这样:

x2<-data.frame(cbind(numsp=rep(c(16,64,256),each=6),Colless=rep(c("hiIc","loIc","midIc"),each=2, times=3), ntree=rep(c(1,2),length.out=18), metric1.lambdE.FALSE=c(11,12,3,4,7,8,35,36,27,28,31,32,23,24,15,16,19,20), metric2.lambdE.FALSE=c(11,12,3,4,7,8,35,36,27,28,31,32,23,24,15,16,19,20),metric1.lambdE.TRUE=c(9,10,1,2,5,6,33,34,25,26,29,30,21,22,13,14,17,18), metric2.lambdE.TRUE=c(9,10,1,2,5,6,33,34,25,26,29,30,21,22,13,14,17,18)))

或者对于参数“Colless”,为每个 Colless 级别的 metric1 和 metric2 提供一组新的列。

提前致谢!

【问题讨论】:

【参考方案1】:

好的,看起来库 reshape2 有一个快速的解决方案:

reshape(x, direction="wide", idvar=c("numsp","Colless","ntree"), timevar="lambdaE")

【讨论】:

这个reshape 函数是stats 包的一部分。 reshape2中没有reshape函数。 所以我注意到在重复的情况下,reshape 函数只接受第一个实例并丢弃其余实例。有没有办法简单地将重复的实例附加到数据框的末尾?【参考方案2】:

reshape2的melt和dcast也可以用:

library(reshape2)
mm =melt(x, id=c('numsp','Colless','lambdaE','ntree'))
dcast(mm, numsp+Colless+ntree~lambdaE+variable)
   numsp Colless ntree FALSE_metric1 FALSE_metric2 TRUE_metric1 TRUE_metric2
1     16    hiIc     1            11            11            9            9
2     16    hiIc     2            12            12           10           10
3     16    loIc     1             3             3            1            1
4     16    loIc     2             4             4            2            2
5     16   midIc     1             7             7            5            5
6     16   midIc     2             8             8            6            6
7    256    hiIc     1            35            35           33           33
8    256    hiIc     2            36            36           34           34
9    256    loIc     1            27            27           25           25
10   256    loIc     2            28            28           26           26
11   256   midIc     1            31            31           29           29
12   256   midIc     2            32            32           30           30
13    64    hiIc     1            23            23           21           21
14    64    hiIc     2            24            24           22           22
15    64    loIc     1            15            15           13           13
16    64    loIc     2            16            16           14           14
17    64   midIc     1            19            19           17           17
18    64   midIc     2            20            20           18           18

【讨论】:

以上是关于根据相似的行值创建新列的主要内容,如果未能解决你的问题,请参考以下文章

如何在遍历熊猫数据框时创建新列并插入行值

如何根据条件行值对 pandas 数据框进行取消堆叠或取消透视?

根据数据框中的其他行值创建列

Pandas:使用 apply 将特定列中的行值复制到新列中

加入 2 个表并将重复的行值显示到新列中

Mysql根据不同的行更新表中的行值