【问题标题】:How do I obtain summary of each unique id如何获取每个唯一 ID 的摘要
【发布时间】:2017-04-27 00:33:09
【问题描述】:

我想为多列中的多个值提取一些汇总统计信息。我的数据如下所示

id                pace       type                   value      abundance 
51                (T)        (JC)                   (L)           0        
51                (T)        (JC)                   (L)           0 
51                (T)        (JC)                   (H)           0
52                (T)        (JC)                   (H)           0
52                (R)        (JC)                   (H)           0
53                (T)        (JC)                   (L)           1
53                (T)        (JC)                   (H)           1
53                (R)        (JC)                   (H)           1
53                (R)        (JC)                   (H)           1
53                (R)        (JC)                   (H)           1
54                (T)        (BC)                 <blank>         0          

54                (T)        (BC)                 <blank>         0 
54                (T)        (BC)                 <blank>         0

我希望有这样的东西

id    ptype       (T)    (R)        (L)      (H)     abundance
51     (JC)        3      0          2        1         0
52     (JC)        1      1          0        2         0
53     (JC)        2      3          1        4         1
54     (BC)        3      0          0        0         0

我已经开始写一些代码了:

for (i in levels(df$id))
{
  extract.event <- df[df$id==i,]# To identify each section
ppace <- table(extract.event$pace) #count table of pace 
ptype <- extract.event$type[1] # extract the first line to be the type
nvalues <- table(extract.event$value) #count table of value
nabundance <- min(extract.event$abundance) #minimum of abundance

d <- cbind(ppace,ptype,forbeh,nvalues,nabundance)

但是我在合并值时遇到了问题,尤其是当 nabundance 打印出一个空表时。我不想按名称提取,因为数据框中的名称太多了。有任何想法吗?我认为这可能与 plyr 包有关,但仍然不确定...

谢谢,

恩典

【问题讨论】:

    标签: r unique plyr


    【解决方案1】:

    我不得不重写您的 data.frame(为了将来参考,请粘贴 dput 的结果,因为我们讨厌重写您的数据)但这是我的尝试。我猜你正在寻找类似聚合函数的东西:

    df <- data.frame(id = as.factor(c(51,51,51,52,52,53,53,53,53,53,54,54,54)), 
          pace = c("(T)","(T)","(T)","(T)","(R)","(T)","(T)","(R)","(R)","(R)","(T)","(T)","(T)"), 
          type = c("(JC)","(JC)","(JC)","(JC)","(JC)","(JC)","(JC)","(JC)","(JC)","(JC)","(BC)","(BC)","(BC)"), value = c("(L)","(L)","(H)","(H)","(H)","(L)","(H)","(H)","(H)","(H)","<blank>","<blank>","<blank>"), 
          abundance = c(0,0,0,0,0,1,1,1,1,1,0,0,0))
    
    smallnames <- colnames(do.call("cbind",as.list(aggregate(cbind(value, pace, abundance) ~ id + type, data = lapply(df, as.character), table))))
    smallnames
    [1] "id"      "type"    "(H)"     "(L)"     "<blank>" "(R)"     "(T)"     "0"      
    [9] "1"
    
    df.new <- do.call("data.frame", as.list(aggregate(cbind(value, pace, abundance) ~ id + type, data = lapply(df, as.character), table)))
    colnames(df.new) <- smallnames
    df.new$abundance <- df.new$`1`
    df.new
      id type (H) (L) <blank> (R) (T) 0 1 abundance
    1 54 (BC)   0   0       3   0   3 3 0         0
    2 51 (JC)   1   2       0   0   3 3 0         0
    3 52 (JC)   2   0       0   1   1 2 0         0
    4 53 (JC)   4   1       0   3   2 0 5         5
    
    df.final <- df.new[, -which(colnames(df.new) %in% c("<blank>","0","1"))]
    df.final
      id type (H) (L) (R) (T) abundance
    1 54 (BC)   0   0   0   3         0
    2 51 (JC)   1   2   0   3         0
    3 52 (JC)   2   0   1   1         0
    4 53 (JC)   4   1   3   2         5
    

    如果这是您正在寻找的内容,或者您​​遇到问题,请告诉我。

    【讨论】:

    • 查看第 2 部分与所需数据框输出相似的编辑
    • aggregate(cbind(value, pace, abundance) ~ id + type, data=lapply(df, as.character), table) 似乎更容易到达那里
    • 这是一行简洁的代码,但是您会注意到,一旦添加了丰度,您就会处理 0 和 1 的计数。另外,聚合确实会留下一个包含矩阵的数据框。第 1 部分在 as.list 聚合对象上使用 do.call + cbind 以使名称更清晰(如要求)和正确格式化(简单的 data.frame)。第 2 部分(虽然看起来很丑)只是迫使事情看起来像 OP 要求的那样。我确实喜欢使用 cbind,+1
    • 是的,你说得对,前面需要有do.call(...。从那里对丰度的预期结果似乎他们想要1,如果一个id有任何值,否则为零,所以这很容易通过分离出丰度来获得。 (ps我认为你可以做到do.call(data.frame
    • 查看我的编辑,我已将其全部更改,包括纳入来自 user2957945 的出色建议。我还更正了丰度,因为我意识到它是在数零而不是仅数 1。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-18
    • 1970-01-01
    • 2017-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多