【问题标题】:Summarise in dplyr package: How to go around `Error: expecting a single value`在 dplyr 包中总结:如何绕过`错误:期望单个值`
【发布时间】:2016-05-31 03:07:13
【问题描述】:

我想按 ID、DRUG、FED 来总结 CONCDVID =1DVID==2 的总和

df<- 
ID  DRUG  FED  DVID  CONC
1    1     1    1     20
1    1     1    2     40
2    2     0    1     30
2    2     0    2     100

我试过用这个:

df2 <- df %>% 
  group_by(ID,DRUG,FED) %>% 
  summarise(SumCOnc=CONC+lag(CONC))

但是我收到了这个错误:

Error: expecting a single value

我在使用mutate 时没有收到错误消息。有没有办法绕过它,所以我在上述情况下使用summarise

输出基本上应该是这样的:

ID  DRUG  FED  SumConc
1    1     1    60
2    2     0    130

【问题讨论】:

  • 沿着同一行。如何在代码SumCOnc=CONC+lag(CONC) 中为 CONC 指定 DVID?前面假设数据已经为ID,DRUG, FED 排序,但情况可能并非总是如此。有没有办法为DVID==1DVID==2指定求和`CONC`给定'ID,FORM,FED`?

标签: r dplyr


【解决方案1】:

这看起来很简单:只需使用sum(),不要乱用lag() ...

获取数据:

df<- read.table(header=TRUE,
text="
ID  DRUG  FED  DVID  CONC
1    1     1    1     20
1    1     1    2     40
2    2     0    1     30
2    2     0    2     100
")

流程:

library(dplyr)
df %>% 
  group_by(ID,DRUG,FED) %>% 
  summarise(SumConc=sum(CONC))

##      ID  DRUG   FED SumConc
## 1     1     1     1      60
## 2     2     2     0     130

【讨论】:

    【解决方案2】:

    一个简单的 Base R 方法是使用 aggregate

    aggregate(CONC ~ ID + DRUG + FED, df, sum)
    
    #  ID DRUG FED CONC
    #1  2    2   0  130   
    #2  1    1   1   60
    

    【讨论】:

      【解决方案3】:

      或来自data.table

      library(data.table)
      setDT(df)[, .(SumConc = sum(CONC)), .(ID, DRUG, FED)]
      #   ID DRUG FED SumConc
      #1:  1    1   1      60
      #2:  2    2   0     130
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-07-16
        • 2017-03-03
        • 1970-01-01
        • 2017-12-22
        • 1970-01-01
        • 1970-01-01
        • 2016-12-08
        • 1970-01-01
        相关资源
        最近更新 更多