簡體   English   中英

如何在R中的數據框中有條件地選擇列

[英]How to select columns conditionally in a data frame in 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"

您正在尋找aggregate 這是一個按性別返回年齡和體重中位數的論壇:

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行與先前表達式中的結果匹配。

這是使用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

就像您看到的所有主要選項一樣,這是dplyr的解決方案:

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

暫無
暫無

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

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