select
#演示数据
library(readxl)
df=read_xlsx("datas/ExamDatas_NAs.xlsx")
df
# A tibble: 50 x 8
class name sex chinese math english moral science
<chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
1 六1班 何娜 女 87 92 79 9 10
2 六1班 黄才菊 女 95 77 75 NA 9
3 六1班 陈芳妹 女 79 87 66 9 10
4 六1班 陈学勤 男 NA 79 66 9 10
5 六1班 陈祝贞 女 76 79 67 8 10
6 六1班 何小薇 女 83 73 65 8 9
7 六1班 雷旺 男 NA 80 68 8 9
8 六1班 陈欣越 男 57 80 60 9 9
9 六1班 黄亦婷 女 77 NA 54 8 10
10 六1班 陈媚 女 68 55 66 8 9
# ... with 40 more rows
用列名或索引选择列
df %>%
select(name,sex,math) #或者select(2,3,5)
# A tibble: 50 x 3
name sex math
<chr> <chr> <dbl>
1 何娜 女 92
2 黄才菊 女 77
3 陈芳妹 女 87
4 陈学勤 男 79
5 陈祝贞 女 79
6 何小薇 女 73
7 雷旺 男 80
8 陈欣越 男 80
9 黄亦婷 女 NA
10 陈媚 女 55
# ... with 40 more rows
还可用
:选择连续的若干列
!反选
&和| 交和并
df %>%
+ select(starts_with("c"))
# A tibble: 50 x 2
class chinese
<chr> <dbl>
1 六1班 87
2 六1班 95
3 六1班 79
4 六1班 NA
5 六1班 76
6 六1班 83
7 六1班 NA
8 六1班 57
9 六1班 77
10 六1班 68
# ... with 40 more rows
df %>%
+ select(matches("m.*a"))
# A tibble: 50 x 2
math moral
<dbl> <dbl>
1 92 9
2 77 NA
3 87 9
4 79 9
5 79 8
6 73 8
7 80 8
8 80 9
9 NA 8
10 55 8
# ... with 40 more rows
df %>%
+ select(contains("a"))
# A tibble: 50 x 4
class name math moral
<chr> <chr> <dbl> <dbl>
1 六1班 何娜 92 9
2 六1班 黄才菊 77 NA
3 六1班 陈芳妹 87 9
4 六1班 陈学勤 79 9
5 六1班 陈祝贞 79 8
6 六1班 何小薇 73 8
7 六1班 雷旺 80 8
8 六1班 陈欣越 80 9
9 六1班 黄亦婷 NA 8
10 六1班 陈媚 55 8
# ... with 40 more rows
#选择所有数值型的列
df %>%
select(
where(is.numeric)
)
# A tibble: 50 x 5
chinese math english moral science
<dbl> <dbl> <dbl> <dbl> <dbl>
1 87 92 79 9 10
2 95 77 75 NA 9
3 79 87 66 9 10
4 NA 79 66 9 10
5 76 79 67 8 10
6 83 73 65 8 9
7 NA 80 68 8 9
8 57 80 60 9 9
9 77 NA 54 8 10
10 68 55 66 8 9
# ... with 40 more rows
df %>%
select(-c(class,name,sex))
# A tibble: 50 x 5
chinese math english moral science
<dbl> <dbl> <dbl> <dbl> <dbl>
1 87 92 79 9 10
2 95 77 75 NA 9
3 79 87 66 9 10
4 NA 79 66 9 10
5 76 79 67 8 10
6 83 73 65 8 9
7 NA 80 68 8 9
8 57 80 60 9 9
9 77 NA 54 8 10
10 68 55 66 8 9
# ... with 40 more rows
#可调整顺序
df %>%
select(starts_with("m"),everything())
# A tibble: 50 x 8
math moral class name sex chinese english science
<dbl> <dbl> <chr> <chr> <chr> <dbl> <dbl> <dbl>
1 92 9 六1班 何娜 女 87 79 10
2 77 NA 六1班 黄才菊 女 95 75 9
3 87 9 六1班 陈芳妹 女 79 66 10
4 79 9 六1班 陈学勤 男 NA 66 10
5 79 8 六1班 陈祝贞 女 76 67 10
6 73 8 六1班 何小薇 女 83 65 9
7 80 8 六1班 雷旺 男 NA 68 9
8 80 9 六1班 陈欣越 男 57 60 9
9 NA 8 六1班 黄亦婷 女 77 54 10
10 55 8 六1班 陈媚 女 68 66 9
# ... with 40 more rows
df %>%
+ select(where(is.numeric),everything())
# A tibble: 50 x 8
chinese math english moral science class name sex
<dbl> <dbl> <dbl> <dbl> <dbl> <chr> <chr> <chr>
1 87 92 79 9 10 六1班 何娜 女
2 95 77 75 NA 9 六1班 黄才菊 女
3 79 87 66 9 10 六1班 陈芳妹 女
4 NA 79 66 9 10 六1班 陈学勤 男
5 76 79 67 8 10 六1班 陈祝贞 女
6 83 73 65 8 9 六1班 何小薇 女
7 NA 80 68 8 9 六1班 雷旺 男
8 57 80 60 9 9 六1班 陈欣越 男
9 77 NA 54 8 10 六1班 黄亦婷 女
10 68 55 66 8 9 六1班 陈媚 女
# ... with 40 more rows
df %>%
+ rename(数学=math,科学=science)
# A tibble: 50 x 8
class name sex chinese 数学 english moral 科学
<chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
1 六1班 何娜 女 87 92 79 9 10
2 六1班 黄才菊 女 95 77 75 NA 9
3 六1班 陈芳妹 女 79 87 66 9 10
4 六1班 陈学勤 男 NA 79 66 9 10
5 六1班 陈祝贞 女 76 79 67 8 10
6 六1班 何小薇 女 83 73 65 8 9
7 六1班 雷旺 男 NA 80 68 8 9
8 六1班 陈欣越 男 57 80 60 9 9
9 六1班 黄亦婷 女 77 NA 54 8 10
10 六1班 陈媚 女 68 55 66 8 9
# ... with 40 more rows
mutate函数
创建新列
df %>%
+ mutate(new_col=1:n())
# A tibble: 50 x 9
class name sex chinese math english moral science new_col
<chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <int>
1 六1班 何娜 女 87 92 79 9 10 1
2 六1班 黄才菊 女 95 77 75 NA 9 2
3 六1班 陈芳妹 女 79 87 66 9 10 3
4 六1班 陈学勤 男 NA 79 66 9 10 4
5 六1班 陈祝贞 女 76 79 67 8 10 5
6 六1班 何小薇 女 83 73 65 8 9 6
7 六1班 雷旺 男 NA 80 68 8 9 7
8 六1班 陈欣越 男 57 80 60 9 9 8
9 六1班 黄亦婷 女 77 NA 54 8 10 9
10 六1班 陈媚 女 68 55 66 8 9 10
# ... with 40 more rows
#n()返回当前分组的样本数,未分组则为总行数
计算新列
df %>%
mutate(total=chinese+math+english+moral+science)
# A tibble: 50 x 9
class name sex chinese math english moral science total
<chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 六1班 何娜 女 87 92 79 9 10 277
2 六1班 黄才菊 女 95 77 75 NA 9 NA
3 六1班 陈芳妹 女 79 87 66 9 10 251
4 六1班 陈学勤 男 NA 79 66 9 10 NA
5 六1班 陈祝贞 女 76 79 67 8 10 240
6 六1班 何小薇 女 83 73 65 8 9 238
7 六1班 雷旺 男 NA 80 68 8 9 NA
8 六1班 陈欣越 男 57 80 60 9 9 215
9 六1班 黄亦婷 女 77 NA 54 8 10 NA
10 六1班 陈媚 女 68 55 66 8 9 206
# ... with 40 more rows
df1=df %>%
mutate(med=median(math,na.rm = TRUE),
label=math>med,
label=as.numeric(label))
# A tibble: 50 x 10
class name sex chinese math english moral science med label
<chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 六1班 何娜 女 87 92 79 9 10 73 1
2 六1班 黄才菊 女 95 77 75 NA 9 73 1
3 六1班 陈芳妹 女 79 87 66 9 10 73 1
4 六1班 陈学勤 男 NA 79 66 9 10 73 1
5 六1班 陈祝贞 女 76 79 67 8 10 73 1
6 六1班 何小薇 女 83 73 65 8 9 73 0
7 六1班 雷旺 男 NA 80 68 8 9 73 1
8 六1班 陈欣越 男 57 80 60 9 9 73 1
9 六1班 黄亦婷 女 77 NA 54 8 10 73 NA
10 六1班 陈媚 女 68 55 66 8 9 73 0
# ... with 40 more rows
替换NA
#replace_na
starwars
# A tibble: 87 x 14
name height mass hair_color skin_color eye_color birth_year sex gender
<chr> <int> <dbl> <chr> <chr> <chr> <dbl> <chr> <chr>
1 Luke Sk~ 172 77 blond fair blue 19 male mascu~
2 C-3PO 167 75 NA gold yellow 112 none mascu~
3 R2-D2 96 32 NA white, bl~ red 33 none mascu~
4 Darth V~ 202 136 none white yellow 41.9 male mascu~
5 Leia Or~ 150 49 brown light brown 19 fema~ femin~
6 Owen La~ 178 120 brown, grey light blue 52 male mascu~
7 Beru Wh~ 165 75 brown light blue 47 fema~ femin~
8 R5-D4 97 32 NA white, red red NA none mascu~
9 Biggs D~ 183 84 black light brown 24 male mascu~
10 Obi-Wan~ 182 77 auburn, wh~ fair blue-gray 57 male mascu~
# ... with 77 more rows, and 5 more variables: homeworld <chr>, species <chr>,
# films <list>, vehicles <list>, starships <list>
starwars %>%
replace_na(list(
hair_color="UNKNOWN",
height=median(.$height,na.rm=TRUE)
))
# A tibble: 87 x 14
name height mass hair_color skin_color eye_color birth_year sex gender
<chr> <int> <dbl> <chr> <chr> <chr> <dbl> <chr> <chr>
1 Luke Sk~ 172 77 blond fair blue 19 male mascu~
2 C-3PO 167 75 UNKNOWN gold yellow 112 none mascu~
3 R2-D2 96 32 UNKNOWN white, bl~ red 33 none mascu~
4 Darth V~ 202 136 none white yellow 41.9 male mascu~
5 Leia Or~ 150 49 brown light brown 19 fema~ femin~
6 Owen La~ 178 120 brown, grey light blue 52 male mascu~
7 Beru Wh~ 165 75 brown light blue 47 fema~ femin~
8 R5-D4 97 32 UNKNOWN white, red red NA none mascu~
9 Biggs D~ 183 84 black light brown 24 male mascu~
10 Obi-Wan~ 182 77 auburn, wh~ fair blue-gray 57 male mascu~
# ... with 77 more rows, and 5 more variables: homeworld <chr>, species <chr>,
# films <list>, vehicles <list>, starships <list>
#fill
gap_data
# A tibble: 9 x 4
site species sample_num bees_present
<chr> <chr> <dbl> <lgl>
1 Bilpin A. longiforlia 1 TRUE
2 NA NA 2 TRUE
3 NA NA 3 TRUE
4 NA A. elongata 1 TRUE
5 NA NA 2 FALSE
6 NA NA 3 TRUE
7 Grose Vale A. terminalis 1 FALSE
8 NA NA 2 FALSE
9 NA NA 2 TRUE
gap_data %>%
fill(site,species)
# A tibble: 9 x 4
site species sample_num bees_present
<chr> <chr> <dbl> <lgl>
1 Bilpin A. longiforlia 1 TRUE
2 Bilpin A. longiforlia 2 TRUE
3 Bilpin A. longiforlia 3 TRUE
4 Bilpin A. elongata 1 TRUE
5 Bilpin A. elongata 2 FALSE
6 Bilpin A. elongata 3 TRUE
7 Grose Vale A. terminalis 1 FALSE
8 Grose Vale A. terminalis 2 FALSE
9 Grose Vale A. terminalis 2 TRUE
if_else
library(readxl)
df=read_xlsx("datas/ExamDatas_NAs.xlsx")
df
# A tibble: 50 x 8
class name sex chinese math english moral science
<chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
1 六1班 何娜 女 87 92 79 9 10
2 六1班 黄才菊 女 95 77 75 NA 9
3 六1班 陈芳妹 女 79 87 66 9 10
4 六1班 陈学勤 男 NA 79 66 9 10
5 六1班 陈祝贞 女 76 79 67 8 10
6 六1班 何小薇 女 83 73 65 8 9
7 六1班 雷旺 男 NA 80 68 8 9
8 六1班 陈欣越 男 57 80 60 9 9
9 六1班 黄亦婷 女 77 NA 54 8 10
10 六1班 陈媚 女 68 55 66 8 9
# ... with 40 more rows
df %>%
mutate(sex=if_else(sex=="男","M","F"))
# A tibble: 50 x 8
class name sex chinese math english moral science
<chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
1 六1班 何娜 F 87 92 79 9 10
2 六1班 黄才菊 F 95 77 75 NA 9
3 六1班 陈芳妹 F 79 87 66 9 10
4 六1班 陈学勤 M NA 79 66 9 10
5 六1班 陈祝贞 F 76 79 67 8 10
6 六1班 何小薇 F 83 73 65 8 9
7 六1班 雷旺 M NA 80 68 8 9
8 六1班 陈欣越 M 57 80 60 9 9
9 六1班 黄亦婷 F 77 NA 54 8 10
10 六1班 陈媚 F 68 55 66 8 9
# ... with 40 more rows
#case_when
df %>%
mutate(math=
case_when(math >= 75 ~ "High",
math >= 60 ~ "Middle",
TRUE ~ "Low"))
# A tibble: 50 x 8
class name sex chinese math english moral science
<chr> <chr> <chr> <dbl> <chr> <dbl> <dbl> <dbl>
1 六1班 何娜 女 87 High 79 9 10
2 六1班 黄才菊 女 95 High 75 NA 9
3 六1班 陈芳妹 女 79 High 66 9 10
4 六1班 陈学勤 男 NA High 66 9 10
5 六1班 陈祝贞 女 76 High 67 8 10
6 六1班 何小薇 女 83 Middle 65 8 9
7 六1班 雷旺 男 NA High 68 8 9
8 六1班 陈欣越 男 57 High 60 9 9
9 六1班 黄亦婷 女 77 Low 54 8 10
10 六1班 陈媚 女 68 Low 66 8 9
# ... with 40 more rows
参考:张敬信老师:R语言编程
网友评论