首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >聚合和转换数据集

聚合和转换数据集
EN

Stack Overflow用户
提问于 2014-03-12 03:45:31
回答 3查看 137关注 0票数 0

我有一个示例数据集,如下所示:

代码语言:javascript
运行
复制
df=data.frame(iter=c(1, 1, 2, 2), exp=c("A", "B", "A", "B"), 
      val=c(2.3, 3.6, 4.0, 5.0))

表格形式如下:

代码语言:javascript
运行
复制
  iter exp val
    1   A  2.3
    1   B  3.6
    2   A  4.0
    2   B  5.0

我试图以一种方式将其转换为组A和B,添加一个值为df$val[1]/df$val[2]df$val[3]/df$val[4]等值的比率列,因此最终结果如下:

代码语言:javascript
运行
复制
   iter ratio
   1    2.3/3.6
   2    4.0/5.0

我觉得这应该是一项蹒跚学步的工作,但我找不到一条路来完成它。任何帮助都是非常感谢的。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-03-12 04:21:24

试试这个:

代码语言:javascript
运行
复制
library(plyr)
df2 <- ddply(df, .(iter), summarise, ratio=paste(val[which(exp=="A")],"/",val[which(exp=="B")],sep=""))

这给了我:

代码语言:javascript
运行
复制
  iter   ratio
     1 2.3/3.6
     2     4/5
票数 2
EN

Stack Overflow用户

发布于 2014-03-12 04:27:16

代码语言:javascript
运行
复制
library(data.table)
DT <- as.data.table(df)
DT[, list(ratio= val[exp=="A"] / val[exp=="B"]), by=iter]

   iter    ratio
1:    1 0.638889
2:    2 0.800000
票数 0
EN

Stack Overflow用户

发布于 2014-03-12 05:19:56

这是基地的一个解决方案。它比plyr解决方案要复杂一些,但也许它是有指导意义的。

代码语言:javascript
运行
复制
do.call(rbind,
   by(df,
      df$iter,
      function(x) {
         with(x, 
            data.frame(
               iter=iter[1],
               ratio=val[which(exp=='A')]/val[which(exp=='B')] ## Or use paste to get a text representation of the ratio
            )
         )
      }
   )
)
## i iter    ratio
## 1    1 0.638889
## 2    2 0.800000

它将数据帧by拆分为iter列,然后取A val元素与B元素的比率。它假设每个级别只有一个这样的值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22341607

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档