[英]Collapse columns before aggregating by count
我想的是一个非常简单的问题,但是经过大量的木板搜索/阅读教程后,我根本无法弄清楚。
我有一个df,第5到12列中的名称条目均为一种类型。 它们是名称字符串(例如,请参见下文)。 我要做的就是使用聚合或ddply(或另一个,如果更简单...)函数折叠这些列,然后返回每个唯一条目的计数。
ID | Name 1 | Name 2 | Name 3
Row 1: 278 | John | Tim | Mike
Row 2: 279 | Tim | Steve | John
Row 3: 280 | Tim | Doug | Dave
因此,理想情况下,我会得到:
Tim | 3
John | 2
Mike | 1
etc. | 1
我知道这对于一栏如何工作:
counts=aggregate(numeric(nrow(df)), df[c(4)], length)
但是,当我在多列中使用相似的行时,它将返回七个列的唯一组合,而不是具有聚集的唯一条目和总和的nx2向量。
counts2=aggregate(numeric(nrow(df)),df[c(5:12)],FUN = function(x) length(unique(x)))
非常感谢您的帮助。
这是使用dplyr
和tidyr
一种方法
foo <- data.frame(id = 278:280,
Name1 = c("John", "Tim", "Mike"),
Name2 = c("Tim", "Steve", "John"),
Name3 = c("Tim", "Doug", "Dave"),
stringsAsFactors = FALSE)
library(dplyr)
library(tidyr)
foo %>%
gather(var, names, -id) %>%
count(names)
# names n
#1 Dave 1
#2 Doug 1
#3 John 2
#4 Mike 1
#5 Steve 1
#6 Tim 3
我没有赶上Hadley提出的新软件包的速度,但是这是我使用reshape2
软件包解决问题的方法。 想法(与上面相同)是将列折叠为一列,然后汇总该数据:
library(reshape2)
dcast(data = melt(foo, id.vars = "id"), value ~ .)
#---
value .
1 Dave 1
2 Doug 1
3 John 2
4 Mike 1
5 Steve 1
6 Tim 3
读取数据:
txt <- "ID | Name 1 | Name 2 | Name 3
Row 1: 278 | John | Tim | Mike
Row 2: 279 | Tim | Steve | John
Row 3: 280 | Tim | Doug | Dave "
dat <- read.csv(text = txt, sep = "|", strip.white = TRUE)
您可以在未列出的列上使用as.data.frame
表方法。
u <- unlist(dat[-1])
as.data.frame(table(levels(u)[u]))
# Var1 Freq
# 1 Dave 1
# 2 Doug 1
# 3 John 2
# 4 Mike 1
# 5 Steve 1
# 6 Tim 3
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.