2015-09-01 72 views
3

是否可以使用R(dplyr)對所有其他列的實例進行分組和計數?例如,下面的數據幀分組和計數實例?

x a b c 
1 0 0 0 
1 1 0 1 
1 2 2 1 
2 1 2 1 

打開這個(注:y是正被計值)

編輯: - 解釋的轉變,x是什麼,我通過分組,每個號碼我想計算0和1和2被提及的次數,如在轉換的數據幀的第一行中,我們計算了x = 1在其他列(y)中等於0的次數,因此0是在列a一次,列b兩次和列c一次

x y a b c 
1 0 1 2 1 
1 1 1 0 2 
1 2 1 1 0 
2 1 1 0 1 
2 2 0 1 0 

回答

4

我想用combi從dplyrgathertidyrspread,並且count國家:

library(dplyr) 
library(tidyr) 
df = data.frame(x = c(1,1,1,2), a = c(0,1,2,1), b = c(0,0,2,2), c = c(0,1,1,1)) 
res = df %>% 
    gather(variable, value, -x) %>% 
    count(x, variable, value) %>% 
    spread(variable, n, fill = 0) 
# Source: local data frame [5 x 5] 
# 
# x value a b c 
# 1 1  0 1 2 1 
# 2 1  1 1 0 2 
# 3 1  2 1 1 0 
# 4 2  1 1 0 1 
# 5 2  2 0 1 0 

本質上講,你首先更改數據集的格式:

head(df %>% 
    gather(variable, value, -x)) 
# x variable value 
#1 1  a  0 
#2 1  a  1 
#3 1  a  2 
#4 2  a  1 
#5 1  b  0 
#6 1  b  0 

,它允許您使用count得到有關特定值出現在列ac的列的信息。之後,使用spread將數據集重新格式化爲所需的格式。

+0

如果你願意,你可以添加一個dcast融化例如自己(以及在某些點耙;))。我現在使用'dplyr'很多,並專注於此。 –

+0

沒關係。這與您展示的方法相同。所以,我認爲這是有道理的添加您的帖子。否則,我將把它作爲評論。謝謝。 – akrun

5

用的data.tablereshape2meltdcast功能相結合的一種方法:

library(data.table) # v1.9.5+ 
dt.new <- dcast(melt(setDT(df), id.vars="x"), x + value ~ variable) 

這給:

dt.new 
# x value a b c 
# 1: 1  0 1 2 1 
# 2: 1  1 1 0 2 
# 3: 1  2 1 1 0 
# 4: 2  1 1 0 1 
# 5: 2  2 0 1 0 

dcast您可以指定哪些聚集函數來使用,但是在這種情況下這是不必要的,因爲默認的聚合函數是length。如果不使用聚合函數,你會得到一個警告有關:

Aggregation function missing: defaulting to length

此外,如果你沒有明確的數據幀轉換成一個數據表,data.table會重定向到reshape2(看到@Arun的解釋註釋)。因此,這個方法可以與reshape2使用,以及:

library(reshape2) 
df.new <- dcast(melt(df, id.vars="x"), x + value ~ variable) 

使用的數據:

df <- read.table(text="x a b c 
1 0 0 0 
1 1 0 1 
1 2 2 1 
2 1 2 1", header=TRUE) 
+0

我一直以爲'dcast'來自'reshape2',而不是'data.table'。或者'data.table'提供'dcast'的特定實現(因爲它是一個通用函數)。在這種情況下,我們不應該先將'df'轉換爲某種'data.table'格式? –

+1

@PaulHiemstra數據的最新版本。table'現在也[包括它自己的'melt'和'dcast'函數的實現](https://rawgit.com/wiki/Rdatatable/data.table/vignettes/datatable-reshape.html)。起初我還認爲你需要使用'setDT()',但顯然這不是必須的,它也適用於數據框(我在課程之前嘗試過); - )。 – Jaap

+0

感謝您的額外信息。 –