簡體   English   中英

根據一個變量對數據框進行分組

[英]Grouping the dataframe based on one variable

我有一個包含10個變量的數據框,所有變量都是數字變量,變量名稱之一是age,我想根據age.example對觀察結果進行分組。 年齡在17至18歲的一組,另一組在19-22歲的年齡,然后每行應附加到每一組。 結果應該是進一步操作的數據框。 數據框模型:

A   B   AGE
25  50  17
30  42  22
50  60  19
65  105 17
355 400 21
68  47  20
115 98  18
25  75  19

我想要像這樣的結果

17-18 
A   B   AGE
25  50  17
65  105 17
115 98  18

19-22
A   B   AGE
30  42  22
50  60  19
355 400 21
68  47  20
115 98  18
25  75  19

我確實使用split函數根據Age var對數據集進行了分組,現在我關心的是如何操作分組的數據。 例如:答案看起來像

$1

  A   B   AGE
  25  50  17
  65  105 17
  115 98  18

$2
A   B   AGE
    30  42  22
    50  60  19
    355 400 21
    68  47  20
    115 98  18
    25  75  19

我的問題是如何訪問每個組進行進一步的操作? 例如:如果我想分別為每個組做t檢驗?

split函數將與數據框一起使用。 使用帶有'breaks'的cut或具有適當cut點集合(如果使用命名參數,則命名為'vec')的findInterval作為分組的標准,第二個參數為split cut的默認設置是在右側關閉間隔,而findInterval默認設置在左側關閉。

> split(dat, findInterval(dat$AGE, c(17, 19.5, 22.5)))
$`1`
    A   B AGE
1  25  50  17
3  50  60  19
4  65 105  17
7 115  98  18
8  25  75  19

$`2`
    A   B AGE
2  30  42  22
5 355 400  21
6  68  47  20

這是cut的方法

lst <- split(df1, cut(df1$AGE, breaks=c(16, 18, 22), labels=FALSE))
lst
# $`1`
#   A   B AGE
#1  25  50  17
#4  65 105  17
#7 115  98  18

#$`2`
#   A   B AGE
#2  30  42  22
#3  50  60  19
#5 355 400  21
#6  68  47  20
#8  25  75  19

更新資料

如果您需要找到sum ,則每個“列表”元素的列mean

lapply(lst, function(x) rbind(colSums(x[-3]),colMeans(x[-3])))

但是,如果目標是根據組查找匯總統計信息,則可以使用任何匯總函數來完成

 library(dplyr)
 df1 %>% 
     group_by(grp=cut(AGE, breaks=c(16, 18, 22), labels=FALSE)) %>% 
     summarise_each(funs(sum=sum(., na.rm=TRUE),
                      mean=mean(., na.rm=TRUE)), A:B)
 #   grp A_sum B_sum    A_mean    B_mean
 #1   1   205   253  68.33333  84.33333
 #2   2   528   624 105.60000 124.80000

或使用base R aggregate

 do.call(data.frame,
   aggregate(cbind(A,B)~cbind(grp=cut(AGE, breaks=c(16, 18, 22), 
    labels=FALSE)), df1, function(x) c(sum=sum(x), mean=mean(x))))

數據

df1 <- structure(list(A = c(25L, 30L, 50L, 65L, 355L, 68L, 115L, 25L
), B = c(50L, 42L, 60L, 105L, 400L, 47L, 98L, 75L), AGE = c(17L, 
22L, 19L, 17L, 21L, 20L, 18L, 19L)), .Names = c("A", "B", "AGE"
), class = "data.frame", row.names = c(NA, -8L))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM