复制R中数据帧的合并和频率计算

时间:2014-02-20 06:01:46

标签: r dataframe

我有一个数据框,我想做三个简单但不明显的事情:

计算字符串在“名称”列中重复的次数,并将其记录在新列中。找到重复项时,将“stop”列中的值一起添加,最后删除该字符串所在的每个后续行。

例如我有:

dim(df)
[1] 80000      2

head(df, 4)
    name          stops       
1 dowewewg.1          1 
2 cat.1               1    
3 dowewewg.1          1    
4 cat.1               2    

输出应为

   name           stops    frequency
1 dowewewg.1          2       2
2 cat.1               3       2

任何想法?

2 个答案:

答案 0 :(得分:0)

您可以使用split / apply / combine来解决此问题。以下是一种方法,使用splitname分割,lapply分别计算每个组的摘要统计信息,do.call分别与rbind合并所有结果

do.call(rbind, lapply(split(df, df$name), function(x) {
  data.frame(name=x$name[1], stops=sum(x$stops), frequency=nrow(x))
}))
#                  name stops frequency
# cat.1           cat.1     3         2
# dowewewg.1 dowewewg.1     2         2

答案 1 :(得分:0)

这是另一种方法

# read in the data
df<-read.table(text="
name          stops       
1 dowewewg.1          1 
2 cat.1               1    
3 dowewewg.1          1    
4 cat.1               2 ",
header=T, stringsAsFactors=F) 

现在:

newdf <- data.frame(
 stops = tapply(df$stops, df$name, sum),
 frequency = as.vector(table(df$name)))
#           stops frequency
#cat.1          3         2
#dowewewg.1     2         2

如果您想要name列:

newdf$name <- rownames(newdf)
#           stops frequency       name
#cat.1          3         2      cat.1
#dowewewg.1     2         2 dowewewg.1