2012-02-23 30 views
3

樣品DATAS:申請總和data.frame由子分組,其中R

> mat1 = as.data.frame(matrix(c("D-J10-N1","D-J10-N2","D-J2-N1","D-J2-N2",3,6,5,7,8,4,2,3,4,1,2,3), ncol = 4)); 
> mat1 
     V1 V2 V3 V4 
1 D-J10-N1 3 8 4 
2 D-J10-N2 6 4 1 
3 D-J2-N1 5 2 2 
4 D-J2-N2 7 3 3 

期望的輸出:

> results 
     V1 V2 V3 V4 
    1 J10 9 12 5 
    2 J2 12 5 5 

所以我需要由V1和然後的子串來總結V2到V4在我的結果中返回這個子字符串。我可以定義我的組爲:

> groups <- substr(mat1[,1],1,5) 
> groups 
[1] "D-J10" "D-J10" "D-J2-" "D-J2-" 

我想用rowsum如:

> rowsum(mat1,groups, reorder = TRUE) 

但rowsum似乎只接受數值的羣體?我查看了應用家庭功能,但沒有找到運氣....關於如何解決這個問題的任何想法?

非常感謝您的幫助!

回答

2

它有助於有data.frame設立所以列班適合更好一點(目前它們都是重要的因素)。

mat1 <- data.frame(V1=c("D-J10-N1","D-J10-N2","D-J2-N1","D-J2-N2"),V2=c(3,6,5,7),V3=c(8,4,2,3),V4=c(4,1,2,3)) 

然後你可以使用aggregatesub挑選出你的子:

aggregate(mat1[-1],by=list(sub("D-(J[0-9]+)-[A-Z0-9]+","\\1",mat1$V1)),sum) 
    Group.1 V2 V3 V4 
1  J10 9 12 5 
2  J2 12 5 5 
+0

感謝您的幫助。你的代碼做我需要的,我理解它。現在,試圖將其應用於我的實際數據集,我得到的參數必須具有相同的長度錯誤。我的論點的長度適合。 MOdified命令:> aggregate(table.off.fem,by = list(sub([DF] - (J [0-9] +) - [A-Z0-9] +「,」\\ 1「,rownames( table.off.fem))),sum)。str(data)給我int表格中的數字,爲什麼我得到這個錯誤? – Chargaff 2012-02-23 23:55:49

+0

> length(table.off.fem [,3]) [1] 136 >長度(rownames(table.off.fem)) [1] 136.數據類型是表,這可能導致錯誤嗎?我不能簡單地理解data.frame我的表.... > 我真的不明白爲什麼我得到這個參數必須有相同長度的錯誤..... – Chargaff 2012-02-24 00:24:42

+0

dim(as.data.frame(table.off.fem))'? – James 2012-02-24 02:02:56

1

首先,讓我們稍微改變一下你的數據。

mat1 <- data.frame(V1 = c("D-J10-N1","D-J10-N2","D-J2-N1","D-J2-N2"), 
        V2 = c(3,6,5,7), 
        V3 = c(8,4,2,3), 
        V4 = c(4,1,2,3)) 

如果你看看str你的初始數據,它們都是字符。這就是爲什麼rowsums erros。

使用strsplitlapply讓你開始:

mat1$new.V1 <- unlist(lapply(strsplit(mat1$V1, '-'), '[', 2)) 

然而,根據第一列中的數據,你可能想使用GSUB和正則表達式:

gsub('.+-([0-z]+)-.+','\\1',mat1$V1) 

或類似的東西那...

然後,我會看看plyr包。

ddply(mat1, .(new.V1), summarise, sums = sum(V2, V3, V4)) 

或者作爲一個醜陋的oneliner:

ddply(mat1, .(unlist(lapply(strsplit(mat1$V1, '-'), '[', 2))), summarise, sum(V2, V3, V4)) 
+0

(+1)單行程非常酷。你需要檢查'options(「stringsAsFactors」)'沒有被設置爲'TRUE',否則它會在'strsplit'中引發一個錯誤。 – chl 2012-02-23 22:12:43

+0

@chl好點。這在我的.R檔案中,所以我忘記了愚蠢的默認設置。 – Justin 2012-02-23 22:28:32

0

data.table包好這種類型的聚集。正如其他人所說,我會重新格式化您的數據,這樣的:

library(data.table) 
mat1 <- data.table(V1=c("D-J10-N1","D-J10-N2","D-J2-N1","D-J2-N2"), 
        V2=c(3,6,5,7), 
        V3=c(8,4,2,3), 
        V4=c(4,1,2,3), 
        key="V1") 

然後你就可以概括如下:

mat1[, lapply(.SD, sum), by=list(V1b=gsub(".*\\-(.*)\\-.*", "\\1", mat1[,V1]))] 
# V1b V2 V3 V4 
#1: J10 9 12 5 
#2: J2 12 5 5 

lapply(.SD, sum)部分總結每個列,by部分分組它由你請求的子串(使用gsub和一個正則表達式)。