2014-02-06 5 views
1

Как найти среднюю/медианную (любую другую такую ​​вещь) женщин? Я попробовал несколько фрагментов кода для доступа к данным о женщинах, в частности, но не увенчался успехом. Любая помощь действительно ценится.Как выбрать столбцы условно в кадре данных в R

> jalal <- read.csv("jalal.csv", header=TRUE,sep=",") 
> which(jalal$sex==F) 
integer(0) 
> jalal 
    age sex weight eye.color hair.color 
1 23 F 93.8  blue  black 
2 21 M 180.8  amber  gray 
3 22 F 196.5  hazel  gray 
4 22 M 256.2  amber  black 
5 21 M 219.6  blue  gray 
6 16 F 152.1  blue  gray 
7 21 F 183.3  gray chestnut 
8 18 M 179.1  brown  blond 
9 15 M 206.1  blue  white 
10 19 M 211.6  brown  blond 
11 20 F 209.4  blue  white 
12 21 M 194.0  brown  auburn 
13 22 F 204.1  green  black 
14 21 F 157.4  hazel  red 
15 15 F 238.0  green  gray 
16 20 F 154.8  gray  gray 
17 16 F 245.8  gray  gray 
18 23 M 198.2  gray  red 
19 19 M 169.1  green  brown 
20 24 M 198.0  green  gray 
> subset(jalal, subset=(sex =F)) -> females 
> females 
[1] age  sex  weight  eye.color hair.color 
<0 rows> (or 0-length row.names) 
> subset(jalal, subset=(sex ==F)) -> females 
> females 
[1] age  sex  weight  eye.color hair.color 
<0 rows> (or 0-length row.names) 

Вот что в jalal.csv:

"age","sex","weight","eye.color","hair.color" 
23,"F",93.8,"blue","black" 
21,"M",180.8,"amber","gray" 
22,"F",196.5,"hazel","gray" 
22,"M",256.2,"amber","black" 
21,"M",219.6,"blue","gray" 
16,"F",152.1,"blue","gray" 
21,"F",183.3,"gray","chestnut" 
18,"M",179.1,"brown","blond" 
15,"M",206.1,"blue","white" 
19,"M",211.6,"brown","blond" 
20,"F",209.4,"blue","white" 
21,"M",194,"brown","auburn" 
22,"F",204.1,"green","black" 
21,"F",157.4,"hazel","red" 
15,"F",238,"green","gray" 
20,"F",154.8,"gray","gray" 
16,"F",245.8,"gray","gray" 
23,"M",198.2,"gray","red" 
19,"M",169.1,"green","brown" 
24,"M",198,"green","gray" 

ответ

5

Вы ищете aggregate. Вот Forumla, которая возвращает средний возраст и вес по полу:

aggregate(cbind(age, weight) ~ sex, data=jalal, FUN=median) 
## sex age weight 
## 1 F 20.5 189.9 
## 2 M 21.0 198.1 

Чтобы получить кадр данных, содержащий только женщины, вот синтаксис [:

jalal[jalal$sex == 'F',] 

Обратите внимание на кавычки 'F' , Голова F означает FALSE. Вот почему ваше второе выражение subset терпит неудачу.

subset(jalal, subset=(sex =='F')) 
## age sex weight eye.color hair.color 
## 1 23 F 93.8  blue  black 
## 3 22 F 196.5  hazel  gray 
## 6 16 F 152.1  blue  gray 

...

В комментарии он запрашивается для метода средних значений для женщин с голубыми глазами. Первый подход заключается в фильтрации кадра данных только голубоглазые люди:

aggregate(cbind(age, weight) ~ sex, data=jalal[jalal$eye.color == 'blue',], FUN=mean) 
## sex  age weight 
## 1 F 19.66667 151.7667 
## 2 M 18.00000 212.8500 

Но это кажется хаком, в конце концов, мы не фильтруем кадр данных о женщинах. Итак, вот формула, которая дает средний возраст и вес по полу и цвету глаз. Исходя из этого, вы можете найти среднее голубоглазых женщин, зелеными глазами мужчин и т.д .:

aggregate(cbind(age, weight) ~ sex + eye.color, data=jalal, FUN=mean) 
## sex eye.color  age weight 
## 1 M  amber 21.50000 218.5000 
## 2 F  blue 19.66667 151.7667 
## 3 M  blue 18.00000 212.8500 
## 4 M  brown 19.33333 194.9000 
## 5 F  gray 19.00000 194.6333 
## 6 M  gray 23.00000 198.2000 
## 7 F  green 18.50000 221.0500 
## 8 M  green 21.50000 183.5500 
## 9 F  hazel 21.50000 176.9500 

Примечание строк 2 и 3 здесь соответствуют результатам предшествующего уровня экспрессии.

+0

Также мне было интересно, может ли 'fun' считать вместо среднего/медианного/взвешенного значения! Например, как я могу использовать агрегат для подсчета числа людей с коричневыми или черными глазами !? Я не мог найти функцию для подсчета в '? Aggregate' - В принципе, я хочу знать, как найти список« забавных »функций в' aggregate' –

+1

Счет является длиной вектора в R. Pass 'FUN = length для этого. Проще всего создать столбец из 1 ('jalal $ count <- 1') и использовать' count' вместо 'cbind (age, weight)' в формуле. –

+0

@Mathew Lundberg: Могу ли я узнать, сколько лет третьему тяжелому человеку, использующему функцию «aggregate»? Я пытался это сделать, но это не помогло: '> aggregate (age ~ weight, data = jalal, FUN = rank)' –

1

Вот альтернативное решение, используя data.table пакет:

require(data.table) 
jalal <- as.data.table(jalal) 

Для подмножества на женщин:

jalal[sex == "F"] 

Чтобы вычислить среднее значение, медиана, и т.д.:

> jalal[sex == "F", mean(weight)] 
[1] 183.52 
> jalal[sex == "F", list(mean(weight), median(age))] 
     V1 V2 
1: 183.52 20.5 
+1

Вы можете назвать столбцы: 'list (MeanWeight = mean (weight), MedianAge = median (age)) ' –

+0

Спасибо! Я все еще участвую в синтаксисе data.table. –

0

Просто так вы видите все основные варианты, вот решение с dplyr:

library(dplyr) 
jalal %.% 
    group_by(sex, eye.color) %.% 
    summarise(age = mean(age), weight = median(weight))