美文网首页R语言R炒面机器学习
9-使用dplyr进行数据操作

9-使用dplyr进行数据操作

作者: wonphen | 来源:发表于2019-12-03 21:57 被阅读0次

    一、数据说明

    • int:表示整数型变量
    • dbl:表示双精度浮点数型变量,或称实数
    • chr:表示字符向量,或称字符串
    • dttm:表示日期时间(日期+时间)型变量
    • lgl:表示逻辑型变量,是一个仅包括TRUE和FALSE的向量
    • fctr:表示因子,R用其表示具有固定数目的值的分类变量
    • date:表示日期型变量

    二、dplyr函数

    • filter:按值筛选观测
    • arrange:对行进行重新排序
    • select:按名称选取变量
    • mutate:使用现有变量的函数创建新变量
    • summarize:将多个值总结为一个摘要统计量

    三、读取数据

    library(pacman)
    p_load(dplyr, openxlsx)
    df <- read.xlsx("C:/Users/Admin/Documents/R/data_set/选拔赛人员名单.xlsx", 
                    sheet = 1, #读取第一个工作簿
                    startRow = 2, #第一行为标题,从第二行开始读取
                    colNames = T, #是否有列名
                    rowNames = F,#是否有行名
                    skipEmptyRows = T,#是否跳过空行
                    skipEmptyCols = T)#是否跳过空列
    df <- tbl_df(df) #让输出适应宽度,更美观
    names(df)
    
    names(df)

    四、对行的操作:sample、distinct、filter

    1.随机选择N行

    df1 <- sample_n(df, 3)
    

    2.随机选择总行的N%

    #随机返回10%的行
    df2 <- sample_frac(df, 0.1)
    

    3.基于所有变量删除重复行

    df3 <- distinct(df)
    

    4.基于单个变量删除重复行

    #keep_all保留输出数据框中的所有其他变量
    df4 <- distinct(df, Name, .keep_all = T)
    

    5.基于多个变量删除重复行

    df5 <- distinct(df, Name, ID_Number, .keep_all = T)
    

    6.选择行

    df12 <- filter(df, Minute == "52")
    

    7.多重选择标准

    df13 <- filter(df6, Minute %in% c(50:60))
    

    8.选择标准中的"AND"条件

    df14 <- filter(df6, Minute %in% c(50:60) & Class_2 == "MBDA/MEM")
    

    9.选择标准中的"OR"条件

    df15 <- filter(df6, Minute %in% c(50:60) | Class_2 == "MBDA/MEM")
    

    10.非条件

    df16 <- filter(df15, !Minute %in% c(50:60))
    

    11.搜索模式匹配

    df17 <- filter(df, grepl("女", gender))
    

    五、对列的操作:select、rename

    12.选择列

    df6 <- select(df, Name, gender, Class_2:Minute)
    

    13.删除变量(列)

    df7 <- select(df6, -Phone_number)
    

    14.选择或删除以P开头的变量

    df8 <- select(df6, -starts_with('P'))
    

    以下函数均可根据名称选择变量:

    函数 作用
    starts_with("abc") 匹配以abc开头的名字
    ends_with("xyz") 匹配以xyz结尾的名字
    contains("ijk") 匹配包含ijk的名称
    matches("(.)\1") 选择匹配正则表达式的那些变量
    num_range("x",1:3) x01,x02,x03这样的数值序列
    one_of() 字符向量之一
    everything() 所有变量

    15.选择变量名中包含“M”的变量

    df9 <- select(df, contains("M"))
    

    16.重新排列变量

    #Minute放在最前面
    df10 <- select(df6, Minute, everything())
    

    17.变量重命名

    #将gender重命名为Gender
    df11 <- rename(df6, Gender = gender)
    

    六、总结:summarize

    18.总结选定的变量

    summ18 <- summarise(df13, Min_mean = mean(Minute), Min_med = median(Minute))
    

    19.总结多个变量

    summ19 <- summarise_at(df13, vars(Minute), funs(n(), mean, median))
    

    20.用自定义的函数进行总结

    summ20 <- summarise_at(df, vars(Minute),
                     funs(n(), missing = sum(is.na(.)),
                     mean(., na.rm = T),
                     median(., na.rm = T)))
    

    21.总结所有的数字变量

    #允许有条件的总结。先得处理缺失值
    summ21 <- summarise_if(df, is.numeric, funs(n(), mean, median))
    #或者
    num_data <- df[sapply(df, is.numeric)]
    summ21_2 <- summarise_all(num_data, funs(n(), mean, median)) 
    

    22.总结因子变量

    df22 <- df11 %>% mutate(Gender = as.factor(Gender))
    summ22 <- summarise_all(df22["Gender"], funs(nlevels(.), nmiss = sum(is.na(.))))
    

    23.按分类变量汇总数据

    summ24 <- summarise_at(group_by(df, Class_2), vars(Minute), funs(n(), mean(., na.rm = T)))
    #或者
    summ24_2 <- df %>% group_by(Class_2) %>% summarise_at(vars(Minute), funs(n(), mean(., na.rm = T)))
    

    24.过滤分类变量中的数据

    df25 <- df %>% filter(Class_2 %in% c("MBDA/MEM", "IMBA")) %>% group_by(ID) %>% do(head(., 3))
    

    25.通过分类变量选择第一最大值

    df26 <- df %>%
      select(Name, Class, Minute) %>%
      filter(Class %in% c("2019级MBDA/MEM", "2019级MBA12")) %>%
      group_by(Class) %>%
      do(arrange(., desc(Minute))) %>%
      #选择第一行
      slice(1)
    
    #或者
    df26_2 <- df %>%
      select(Name, Class, Minute) %>%
      filter(Class %in% c("2019级MBDA/MEM", "2019级MBA12")) %>%
      group_by(Class) %>%
      filter(min_rank(desc(Minute)) == 1)
    

    七、总结、分组和排序:summarize、group_by、arrange

    27.按多个变量排序数据

    df23 <- arrange(df22, Minute, Class_2)
    #对其中一个降序,其他升序
    df23_2 <- arrange(df22, desc(Minute), Name)
    
    df27 <- df %>%
      group_by(Class_2) %>%
      summarise(mean_class = mean(Minute, na.rm = T)) %>%
      arrange(desc(mean_class))
    

    八、创建新变量:mutate

    28.创建一个hours变量

    df28 <- mutate(df, hours = Minute/60)
    

    29.将所有变量改为hours乘以60,并用后缀_new命名

    df29 <- mutate_all(df28, funs("new" = hours * 60))
    

    30.计算变量的排名

    df30 <- mutate_at(na.omit(df), vars(Minute), funs(Rank = min_rank(.)))
    

    相关文章

      网友评论

        本文标题:9-使用dplyr进行数据操作

        本文链接:https://www.haomeiwen.com/subject/blphgctx.html