我有一个数据框,我想做三个简单但不明显的事情:
计算字符串在“名称”列中重复的次数,并将其记录在新列中。找到重复项时,将“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
任何想法?
答案 0 :(得分:0)
您可以使用split / apply / combine来解决此问题。以下是一种方法,使用split
按name
分割,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