如何获得每个唯一ID的摘要

5

我希望能够提取多列数值的一些摘要统计信息。我的数据如下:

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包有关,但仍然不确定...谢谢,Grace。
1个回答

3

我不得不重写你的数据框(将来请粘贴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

如果这正是你所寻找的内容,或者你对此有任何问题,请告诉我。


参考修改后的内容,其中 part2 与您所需的数据框输出类似。 - Evan Friedland
2
aggregate(cbind(value, pace, abundance) ~ id + type, data=lapply(df, as.character), table) 看起来似乎更容易实现。 - user2957945
这是一行整洁的代码,但是一旦你添加了大量数据,你就会处理0和1的计数。此外,聚合函数确实会在其内部留下一个包含矩阵的数据框。第一部分使用do.call + cbind对as.list聚合对象进行操作,以使名称更清晰(如要求)并正确格式化(一个简单的数据框)。第二部分(看起来很丑),只是强制让事情看起来像OP所要求的那样。我确实喜欢使用cbind,+1。 - Evan Friedland
是的,你说得对,它需要在前面加上do.call(...。从那里开始,对于丰度的预期结果似乎是如果一个ID有任何值,则为1,否则为零,因此通过分离丰度来获得这将很容易。(PS我认为你可以使用do.call(data.frame - user2957945
嗨@EvanFriedland,是的,这就是我要找的,谢谢!我已经能够在我的数据中进行一些适应。唯一的问题是,它没有聚合列内的值,而只是为每个id给出总列数的计数。所以例如,对于id 51,value列= 3而不是创建2列H和L...有什么想法吗?这可能与数据结构有关吗?我的id是一个因子。 - Grace Sutton
1
看我的修改,我把它全部改了,包括整合user2957945的伟大建议。我也修正了abundance,因为我意识到它在计算0而不是仅计算1。 - Evan Friedland

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接