如何在不知道R中的ID的情况下根据唯一ID汇总列?

时间:2014-10-10 07:41:57

标签: r count plyr dplyr summary

我一直在浏览有关汇总数据的帖子,但似乎找不到我想要的东西。

我希望创建一个摘要" count-table"这将让我看到某种药物给患者的频率。一些患者同时接受多种药物的事实并不重要,因为我只是想要给出所有药物的总结,然后计算每种药物类别给出的所有药物的百分比。问题是,我不知道给出的可能药物的名称,他们已经隐藏了#34;在data.frame中的某个地方,因此,我必须指定R必须首先查看哪些列以创建"列表"然后它可以汇总列。

我预计这会指向plyr包,但我尝试正确使用其中的功能直到现在还没有工作。

我的df看起来像这样

x <- sample(letters[1:4], 20, replace = TRUE)
y <- sample(letters[1:5], 20, replace = TRUE)
z <- sample(letters[1:6], 20, replace = TRUE)
df<-data.frame(x,y,z)
head(df)
  x y z
1 a a f
2 a c d
3 b b e
4 c d b
5 a a b
6 c d d

如您所见,data.frame包含三列具有相同但不同字母的列,表示给定药物的名称。

我现在要做的是创建一个独特字符列表,

unique(x)
unique(y)
unique(z)

作为我的参考列表,然后R可以汇总每列中的计数。

summary(df)

返回每列的计数摘要,但不返回每个ID本身的计数,也没有所有唯一计数的百分比。

我也尝试了以下方法,这种方法朝着正确的方向发展,但理想情况下,我想要一个独特字符列表,我可以将其添加到length参数

ddply(df, .(x), summarize, counts=length(unique(y)))

知道我怎么能这样做吗?非常感谢。

2 个答案:

答案 0 :(得分:1)

如果您只想对整个数据帧进行计数,可以使用table(unlist(df))(另请参阅@ goctlr的回答)&amp;如果你也想要概率:prop.table(table(unlist(df)))。如果您还想获得各列的计数,则会变得更加困难。

为了获得每列的计数和总计数,我编写了以下函数:

# some reproducible data:
set.seed(1)
x <- sample(letters[1:4], 20, replace = TRUE)
y <- sample(letters[1:5], 20, replace = TRUE)
z <- sample(letters[1:6], 20, replace = TRUE)
df <- data.frame(x,y,z)

# the function
func <- function(x) {
  x2 <- data.frame()
  nms <- names(x)
  id <- sort(unique(unlist(x)))
  for(i in 1:length(id)) {
    for(j in 1:length(nms)) {
      x2[i,j] <- sum(x[,j] %in% id[i])
    }
  }
  names(x2) <- nms
  x2$total <- rowSums(x2)
  x2 <- cbind(id,x2)
  assign("dat", x2, envir = .GlobalEnv)
}

使用func(df)执行该功能会在您的全球环境中为您提供数据框dat

> dat
  id x y z total
1  a 4 4 3    11
2  b 5 5 2    12
3  c 5 4 4    13
4  d 6 4 5    15
5  e 0 3 5     8
6  f 0 0 1     1

之后,您可以使用例如dplyr包计算百分比:

library(dplyr)
dat <- dat %>% mutate(xperc=round(100*x/sum(total),1),
                      yperc=round(100*y/sum(total),1),
                      zperc=round(100*z/sum(total),1),
                      perc=round(100*total/sum(total),1))

导致:

> dat
  id x y z total xperc yperc zperc perc
1  a 4 4 3    11   6.7   6.7   5.0 18.3
2  b 5 5 2    12   8.3   8.3   3.3 20.0
3  c 5 4 4    13   8.3   6.7   6.7 21.7
4  d 6 4 5    15  10.0   6.7   8.3 25.0
5  e 0 3 5     8   0.0   5.0   8.3 13.3
6  f 0 0 1     1   0.0   0.0   1.7  1.7

答案 1 :(得分:1)

有关整个数据框计数的摘要,您可以取消列出数据框,然后调用表函数:

table(unlist(df))

要获得总计数的百分比,请保存结果并使用prop.table函数:

tout <- table(unlist(df))
prop.table(tout)