2014-02-20 122 views
0

數據幀的頻率計算我有一個數據幀,我想這樣做三個簡單的,但不很明顯的東西出來:重複合併和R中

算在「名稱」的時間串的重複量列並將其記錄在新列中。 。在「停止」欄中添加值時,一起副本被發現,最後,將所有後續一行串在

比如我有:

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

您可以使用split/apply/combine來解決這個問題。這裏有一種方法,其使用split分割爲name,lapply以計算每個組的彙總統計,並使用do.callrbind組合所有結果。

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 
+0

感謝。事實證明,這在R中需要非常長的時間。任何想法如何在python中實現? – user3141121

+0

@ user3141121如果你想在python而不是R中執行此操作,我會發佈一個標有python標籤的新問題,以便社區可以幫助你。 – josliber

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