精华内容
下载资源
问答
  • 交换列r语言
    2022-07-27 14:35:25

     data1<- data[,c(1,7,2,8,5,11,6,12,3,9,4,10)]

    #将原来的1-12列变成了1,7,2,8,5,11,6,12,3,9,4,10

    #参考R语言数据框怎么调换列的位置 - R语言论坛 - 经管之家(原人大经济论坛) (pinggu.org)

    更多相关内容
  • 但由于R语言和Pandas有部分差别较大,在尽量不修改原题的基础上制作完成。本项目包含基础、基本数据处理、金融数据处理、科学计算、补充内容 5个部分。一共涵盖了数据处理、计算、可视化等常用操作,并对部分题目给...
    本文来源:和鲸社区优秀创作者 @刘早起

    本套习题源于Pandas进阶修炼120题系列。但由于R语言和Pandas有部分差别较大,在尽量不修改原题的基础上制作完成。

    本项目包含基础、基本数据处理、金融数据处理、科学计算、补充内容 5个部分。一共涵盖了数据处理、计算、可视化等常用操作,并对部分题目给出了多种解法与注解。动手敲一遍代码一定会让你有所收获!

    点击下方链接,查看完整项目&数据集,及直接在线运行

    R语言数据处理120题​www.kesci.com

    所有代码均已在本地测试通过,但是由于不同包的版本不同可能会导致代码报错

    请自行按照提示修改或者百度解决


    PART 1 基础

    1.数据创建

    ### 方法1
    df <- data.frame(
      "grammer" = c("Python","C","Java","GO",NA,"SQL","PHP","Python"),
      "score" = c(1,2,NA,4,5,6,7,10)
    )
    df
    
    ### 方法2
    library(tibble)
    df <- tibble(
      "grammer" = c("Python","C","Java","GO",NA,"SQL","PHP","Python"),
      "score" = c(1,2,NA,4,5,6,7,10)
    )

    2.数据提取

    提取含有字符串"Python"的行

    df[which(df$grammer == 'Python'),]

    3.数据提取

    输出df的所有列名

    names(df)

    4.数据修改

    修改第二列列名为'popularity'

    options(warn=-1)
    library(dplyr)
    library(tidyverse)
    df <- df %>% rename(popularity = score)
    df

    5.数据统计

    统计grammer列中每种编程语言出现的次数

    table(df$grammer)

    6.缺失值处理

    将空值用上下值的平均值填充

    library(Hmisc)
    index <- which(is.na(df$popularity))
    df$popularity <- impute(df$popularity,
                           (unlist(df[index-1, 2] +
                                   df[index+1, 2]))/2)

    7.数据提取

    提取popularity列中值大于3的行

    df %>%
      filter(popularity > 3)

    8.数据去重

    按照grammer列进行去重

    df[!duplicated(df$grammer),]

    9.数据计算

    计算popularity列平均值

    ## 第一种
    mean(df$popularity)
    
    ## 第二种
    df %>%
      summarise(mean = mean(popularity))

    10.格式转换

    将grammer列转换为list

    unlist(df$grammer)

    11.数据保存

    将DataFrame保存为EXCEL

    #R对EXCEL文件不太友好
    #第一种方法:利用readr包转为csv再用EXCEL打开
    #文件本质依然是csv
    library(readr)
    write_excel_csv(df,'filename.csv')

    12.数据查看

    查看数据行列数

    dim(df)

    13.提取数据

    提取popularity列值大于3小于7的行

    library(dplyr)
    df %>%
      filter(popularity > 3 & popularity <7)

    14.数据处理

    交换两列数据

    df <- df %>%
        select(popularity,everything())

    15.数据提取

    提取popularity列最大值所在行

    df %>%
      filter(popularity == max(popularity))

    16.数据查看

    查看最后5行数据

    tail(df,5)

    17.数据修改

    删除最后一数据

    df[-dim(df)[1],]

    18.数据修改

    添加一行数据['Perl',6.6]

    row <- data.frame(
      "grammer" = c("Perl"),
      "popularity" = c(6.6)
    ) # 需要和列的位置对应
    df <- rbind(df,row)

    19.数据排序

    对数据按照"popularity"列值的大小进行排序

    df <- df %>%
      arrange(popularity)

    20.数据统计

    统计grammer列每个字符串的长度

    library(Hmisc)
    library(stringr)
    df$grammer <- impute(df$grammer,'R')
    str_length(df$grammer)
    
    df$len_str <- str_length(df$grammer)

    PRAT 2 基本数据处理

    21.读取本地Excel数据

    library(readr)
    df <- read_csv('pandas120.csv')

    22.查看df数据前5行

    # 默认是6行,可指定行数
    head(df,5)

    23.将salary列数据转换为最大值与最小值的平均值

    library(stringr)
    df$salary <- df$salary %>%
      str_replace_all('k','') %>%
      str_split('-',simplify = T) %>%
      apply(2,as.numeric) %>%
      rowMeans() * 1000
    df

    24.将数据根据学历进行分组并计算平均薪资

    library(dplyr)
    library(tibble)
    df %>%
      group_by(education) %>%
      summarise(mean = mean(salary))

    25.将createTime列时间转换为月-日

    #转化后该列属性是 字符串,R中对时间格式要求严格
    df$createTime <- as.Date(df$createTime) %>%
      str_replace('2020-','')

    26.查看索引、数据类型和内存信息

    str(df)
    
    # 内存查看需要用到其他的库
    library(pryr)
    object_size(df)
    # 6.66 kB

    27查看数值型列的汇总统计

    summary(df)

    28.新增一列根据salary将数据分为三组

    #用ifelse也可以
    #底层原理有差别但实现结果一样
    df <- df %>%
      mutate(categories = case_when(
        df$salary >= 0 & df$salary < 5000 ~ '低',
        df$salary >= 5000 & df$salary < 20000 ~ '低',
        TRUE ~ '高'
      ))

    29.按照salary列对数据降序排列

    df %>%
      arrange(desc(salary))

    30.取出第33行数据

    df[33,]

    31.计算salary列的中位数

    median(df$salary)

    32.绘制薪资水平频率分布直方图

    library(ggplot2)
    
    df %>%
      ggplot(aes(salary)) +
      geom_histogram(bins = 10) # 这个跟python的bins一致

    33.绘制薪资水平密度曲线

    df %>%
      ggplot(aes(salary)) +
      geom_density() +
      xlim(c(0,70000))

    34.删除最后一列categories

    df <- df[,-4]

    35.将df的第一列与第二列合并为新的一列

    df <- df %>%
      mutate(test = paste0(df$education,df$createTime))

    36.将education列与salary列合并为新的一列

    备注:salary为int类型,操作与35题有所不同

    df <- df %>%
      mutate(test1 =
               paste0(df$salary,df$education))

    37.计算salary最大值与最小值之差

    df %>%
      summarise(delta = max(salary) - min(salary)) %>%
      unlist()

    38.将第一行与最后一行拼接

    rbind(df[1,],df[dim(df)[1],])

    39.将第8行数据添加至末尾

    rbind(df,df[8,])

    40.查看每列的数据类型

    str(df)

    41.将createTime列设置为索引

    df %>%
      tibble::column_to_rownames('createTime')

    42.生成一个和df长度相同的随机数dataframe

    df1 <- sapply(135,function(n) {
      replicate(n,sample(1:10,1))
    })
    # 列名暂时不一样,下一题重命名

    43.将上一题生成的dataframe与df合并

    df <- cbind(df,df1) %>%
      rename(`0` = df1)
    # 非常规命名需要用``包裹变量名

    44.生成新的一列new为salary列减去之前生成随机数列

    df <- df %>%
      mutate(new = salary - `0`)

    45.检查数据中是否含有任何缺失值

    # 这个包的结果呈现非常有趣
    library(mice)
    md.pattern(df)

    46.将salary列类型转换为浮点数

    as.double(df$salary)

    47.计算salary大于10000的次数

    df %>%
      filter(salary > 10000) %>%
      dim(.) %>%
      .[1]

    48.查看每种学历出现的次数

    table(df$education)

    49.查看education列共有几种学历

    length(unique(df$education))
    # [1] 4

    50.提取salary与new列的和大于60000的最后3行

    df[df$salary + df$new > 60000,] %>%
      .[nrow(.)-3+1:nrow(.),] %>%
      na.omit(.)

    PART 3 金融数据处理

    51.读取本地Excel数据

    library(readr)
    df <- read_csv('600000.SH.csv')

    52.查看数据前三行

    head(df,3)

    53.查看每列数据缺失值情况

    colSums(is.na(df))

    54.提取日期列含有空值的行

    df[is.na(df$日期),]

    55.输出每列缺失值具体行数

    library(glue)
    
    for (i in names(df)){
      if(sum(is.na(df[,'日期'])) != 0){
        res1 <- which(is.na(df[,i]))
        res2 <- paste(res1,collapse = ',')
        print(glue('列名:"{i}", 第[{res2}]行有缺失值'))
      }
    }

    56.删除所有存在缺失值的行

    df <- na.omit(df)

    57.绘制收盘价的折线图

    library(ggplot2)
    
    df %>%
      ggplot(aes(日期,`收盘价(元)`)) +
      geom_line()

    58.同时绘制开盘价与收盘价

    df %>%
      ggplot() +
      geom_line(aes(日期,`收盘价(元)`), size=1.2, color='steelblue') +
      geom_line(aes(日期,`开盘价(元)`), size=1.2, color='orange') +
      ylab(c('价格(元)'))
    ## 这种画出来没有图例,当然可以手动添加,但为了映射方便可以用另一种方法
    
    ## 方法二
    library(tidyr)
    
    df %>%
      select(日期,`开盘价(元)`,`收盘价(元)`) %>%
      pivot_longer(c(`开盘价(元)`,`收盘价(元)`),
                   names_to='type',values_to='price') %>%
      ggplot(aes(日期,price,color=type)) +
      geom_line(size=1.2) +
      scale_color_manual(values=c('steelblue','orange')) +
      theme_bw() +
      theme(
        panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        legend.title = element_blank(),
        legend.position = c(0.86, 0.9)
      )

    59.绘制涨跌幅的直方图

    df %>%
      ggplot(aes(`涨跌幅(%)`)) +
      geom_histogram()
    # 可以指定bins

    60.让直方图更细致

    df %>%
      ggplot(aes(`涨跌幅(%)`)) +
      geom_histogram(bins=30)

    61.以data的列名创建一个dataframe

    temp <- as_tibble(names(df))

    62.打印所有换手率不是数字的行

    #换手率这一列属性为chr,需要先强转数值型
    #如果转换失败会变成NA,判断即可
    df[is.na(as.numeric(df$`换手率(%)`)),]

    63.打印所有换手率为--的行

    df %>%
      filter(`换手率(%)` == '--')

    64.重置data的行号

    rownames(df) <- NULL
    
    # 如果是tibble则索引始终是按顺序

    65.删除所有换手率为非数字的行

    df[!is.na(as.numeric(df$`换手率(%)`)),]
    # 或者根据前几题的经验,非数字就是'--'
    df <- df %>%
      filter(`换手率(%)` != '--')

    66.绘制换手率的密度曲线

    df$`换手率(%)` <- as.double(df$`换手率(%)`)
    ggplot(df) +
      geom_density(aes(`换手率(%)`))

    67.计算前一天与后一天收盘价的差值

    df %>%
      summarise(delta = `收盘价(元)` - lag(`收盘价(元)`))

    68.计算前一天与后一天收盘价变化率

    df %>%
      summarise(pct_change = (`收盘价(元)` - lag(`收盘价(元)`))/lag(`收盘价(元)`))

    69.设置日期为索引

    df %>%
      column_to_rownames(var='日期')

    70.以5个数据作为一个数据滑动窗口,在这个5个数据上取均值(收盘价)

    library(RcppRoll)
    df %>%
      transmute(avg_5 = roll_mean(`收盘价(元)`,n = 5,align="right",fill = NA))

    71.以5个数据作为一个数据滑动窗口,计算这五个数据总和(收盘价)

    df %>%
      transmute(sum_5 = roll_sum(`收盘价(元)`,n = 5,align="right",fill = NA))

    72.将收盘价5日均线、20日均线与原始数据绘制在同一个图上

    df %>%
      mutate(avg_5 = roll_mean(`收盘价(元)`,n = 5,align="right",fill = NA),
             avg_20 = roll_mean(`收盘价(元)`,n = 20,align="right",fill = NA)) %>%
      ggplot() +
      geom_line(aes(日期,`收盘价(元)`),color = 'steelblue',size = 1.2) +
      geom_line(aes(日期,avg_5),color = 'orange',size = 1.2) +
      geom_line(aes(日期,avg_20),color = 'green',size = 1.2)

    73.按周为采样规则,取一周收盘价最大值

    library(plyr)
    
    res <- dlply(df,.(cut(日期,"1 week")),"[")
    res_max <- sapply(res,function(n)max(n$`收盘价(元)`),simplify=TRUE)
    as.data.frame(res_max)

    74.绘制重采样数据与原始数据

    res %>%
      rownames_to_column('date')
    res$date <- as.Date(res$date)
    
    ggplot(df) +
      geom_line(aes(日期,`收盘价(元)`),color = 'steelblue',size = 1.2) +
      geom_line(data = res, aes(date,res_max),
                color = 'orange',size = 1.2)

    75.将数据往后移动5天

    lag(df,5)

    76.将数据向前移动5天

    lead(df,5)

    77.使用expending函数计算开盘价的移动窗口均值

    #R中没有expanding完全一致的函数
    #考虑到expanding实际功能就是累积均值
    #可以用cummean
    #但cummean的功能和我预想的不同
    #可能是包之间相互干扰
    #最后采用cumsum/1:n的形式完成本题
    
    res <- df %>%
      transmute(cummean = cumsum(`开盘价(元)`)/1:dim(df)[1])

    78.绘制上一题的移动均值与原始数据折线图

    library(tidyr)
    df %>%
      cbind(res) %>%
      dplyr::rename(Opening_Price = `开盘价(元)`,
             Expanding_Open_Mean = cummean) %>%
      select(日期,Opening_Price,Expanding_Open_Mean) %>%
      pivot_longer(c(Opening_Price,Expanding_Open_Mean),
                   names_to = 'type',
                   values_to ='price') %>%
      ggplot(aes(日期,price,color = type)) +
      geom_line(size=1.2) +
      scale_color_manual(values=c('orange','steelblue')) +
      theme_bw() +
      theme(
        panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        legend.title = element_blank(),
        legend.position = c(0.9, 0.9)
      )

    79.计算布林指标

    df <- df %>%
      mutate(avg_20 = roll_mean(`收盘价(元)`,n = 20,align="right",fill = NA),
             upper_bound = avg_20 + 2 * roll_sd(`收盘价(元)`,n = 20,align="right",fill = NA),
             lower_bound = avg_20 - 2 * roll_sd(`收盘价(元)`,n = 20,align="right",fill = NA))

    80.计算布林线并绘制

    df %>%
      dplyr::rename(former_30_days_rolling_Close_mean = avg_20,
                    Closing_Price = `收盘价(元)`) %>%
      select(日期,Closing_Price,
               former_30_days_rolling_Close_mean,upper_bound,lower_bound) %>%
      pivot_longer(c(Closing_Price,former_30_days_rolling_Close_mean,upper_bound,lower_bound),
                   names_to = 'type',
                   values_to ='price') %>%
      ggplot(aes(日期,price,color = type)) +
      geom_line(size=1.2) +
      scale_color_manual(values=c('steelblue','orange','red','green')) +
      theme_bw() +
      theme(
        panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        legend.title = element_blank(),
        legend.position = c(0.6, 0.2)
      )

    PART 4 科学计算

    备注:在Pandas120题中,本期为NumPy结合,R中则没有NumPy,尽可能保持一致

    81.查看包的版本

    packageVersion("tidyverse")
    
    packageVersion("dplyr")

    82.从数组创建DataFrame

    df1 <- sapply(20,function(n) {
      replicate(n,sample(1:100,1))
    }) %>%
      as.data.frame(.) %>%
      dplyr::rename(`0` = V1)

    83.生成20个0-100固定步长的数

    df2 <- as.data.frame(seq(0,99,5)) %>%
      dplyr::rename(`0` = "seq(0, 99, 5)")

    84.生成20个指定分布(如标准正态分布)的数

    df3 <- as.data.frame(rnorm(20,0,1)) %>%
      dplyr::rename(`0` = "rnorm(20, 0, 1)")

    85.将df1,df2,df3按照行合并为新DataFrame

    df <- rbind(df1,df2,df3)

    86.将df1,df2,df3按照列合并为新DataFrame

    df <- cbind(df1,df2,df3)
    names(df) <- c(0,1,2)

    87.查看df所有数据的最小值、25%分位数、中位数、75%分位数、最大值

    summary(unlist(df))

    88.修改列名为col1,col2,col3

    df <- df %>%
      dplyr::rename(col1 = 1,
                    col2 = 2,
                    col3 = 3)
    # 或者用类似pandas的方法
    names(df) <- c('col1','col2','col3')

    89.提取第一列中不在第二列出现的数字

    df[!(df$col1 %in% df$col2),1]

    90.提取第一列和第二列出现频率最高的三个数字

    count(unlist(c(df$col1,df$col2))) %>%
      arrange(desc(freq)) %>%
      filter(row_number() <= 3)

    91.提取第一列中可以整除5的数字位置

    which(df['col1'] %% 5==0)

    92.计算第一列数字前一个与后一个的差值

    df %>%
      summarise(col1 - lag(col1)) %>%
      na.omit(.) # 不去NA也可以,pandas没有去除

    93.将col1,col2,clo3三列顺序颠倒

    df %>%
      select(col3,col2,everything())

    94.提取第一列位置在1,10,15的数字

    df[c(1,10,15) + 1,1]

    95.找第一列的局部最大值位置,即比它前一个与后一个数字的都大的数字

    res1 <- which((df$col1 - lag(df$col1) > 0))
    res2 <- which((df$col1 - lead(df$col1) > 0))
    
    intersect(res1,res2)
    # [1] 3 5 7 12 14 17 19
    
    # 另一种方法,类似pandas的用符号判断
    
    res <- sign(df$col1 - lag(df$col1))
    
    which(res - lag(res) == -2) - 1
    # # [1] 3 5 7 12 14 17 19

    96.按行计算df的每一行均值

    rowMeans(df)

    97.对第二列计算移动平均值

    备注:每次移动三个位置,不可以使用自定义函数

    library(RcppRoll)
    
    df %>%
      summarise(avg_3 = roll_mean(col2, n=3))

    98.将数据按照第三列值的大小升序排列

    df <- df %>%
      arrange(col3)

    99.将第一列大于50的数字修改为'高'

    df[df$col1 > 50,1] <- '高'

    100.计算第一列与第二列之间的欧式距离

    # 可以利用概念计算
    res <- (df$col1 - df$col2) ^ 2
    sqrt(sum(res))
    # [1] 197.0102
    
    # 也可以利用dist函数,但需要形成两个不同的观测
    dist(rbind(df$col1,df$col2))
    # 1
    # 2 197.0102

    PART 5 一些补充

    101.从CSV文件中读取指定数据

    从数据1中的前10行中读取positionName, salary两列

    #一步读取文件的指定列用readr包或者原生函数都没办法
    #如果文件特别大又不想全部再选指定列可以用如下办法
    #基本思想先读取较少的数据获取列名
    #给目标列以外的列打上NULL导致第二次读取文件时NULL列丢失即可
    
    res <- read.csv('数据1.csv',encoding = 'GBK',nrows = 3)
    classes <- sapply(res, class)
    classes[-match(c('positionName','salary'),names(classes))] <-
      rep('NULL', length(classes) - 2)
    
    df <- read.csv('数据1.csv',encoding = 'GBK',nrows = 10,
                   colClasses = classes)

    102.从数据2中读取数据并在读取数据时将薪资大于10000的为改为高

    library(readr)
    
    df2 <- read_csv('数据2.csv') %>%
      mutate('学历要求',
             '薪资水平' = ifelse(
               薪资水平 > 10000,'高','低'))

    103.从上一题数据中,对薪资水平列每隔20行进行一次抽样

    df2[seq(1,dim(df2)[1],20),]

    104.将数据取消使用科学计数法

    df <- tibble(data = runif(10)^10)
    round(df,3)

    105.将上一题的数据转换为百分数

    tibble(data = str_glue('{round(df$data * 100,2)}%'))

    106.查找上一题数据中第3大值的行号

    df %>%
      mutate(nrow = rownames(.)) %>%
      arrange(desc(data)) %>%
      filter(row_number() == 3) %>%
      select(nrow)

    107.反转df的行

    df %>%
      arrange(desc(rownames(.)))

    108.按照多列对数据进行合并

    df1 <- data.frame(
      "key1" = c("K0","K0","K1","K2"),
      "key2" = c("K0","K1","K0","K1"),
      "A" = paste0('A',0:3),
      "B" = paste0('B',0:3)
    )
    
    df2 <- data.frame(
      "key1" = c("K0","K1","K1","K2"),
      "key2" = paste0('K',rep(0,4)),
      "C" = paste0('C',0:3),
      "D" = paste0('D',0:3)
    )
    
    full_join(df1,df2,by = c('key1','key2')) %>%
      na.omit(.)

    109.按照多列对数据进行合并,只保存df1的数据

    left_join(df1,df2,by = c('key1','key2'))

    110.再次读取数据1并显示所有的列

    数据中由于列数较多中间列不显示

    df <- read_csv('数据1.csv', locale = locale(encoding = "GBK")) %>%
      print(width = Inf)

    111.查找secondType与thirdType值相等的行号

    df %>%
      mutate(nrow = rownames(.)) %>%
      filter(secondType == thirdType) %>%
      select(nrow) %>%
      unlist()

    112.查找薪资大于平均薪资的第三个数据

    df %>%
      mutate(nrow = rownames(.)) %>%
      filter(salary > mean(salary)) %>%
      select(nrow) %>%
      filter(row_number() == 3)
    # # A tibble: 1 x 1
    # nrow
    # <chr>
    # 1 6

    113.将上一题数据的salary列开根号

    df %>%
      summarise(salary_sqrt = sqrt(salary))

    114.将上一题数据的linestaion列按_拆分

    df <- df %>%
      mutate(split = str_split(linestaion,'_'))

    115.查看上一题数据中一共有多少列

    length(df)

    116.提取industryField列以'数据'开头的行

    df[grep("^数据", df$industryField),]

    117.以salary score 和 positionID制作数据透视

    df <- df %>%
      group_by(positionId) %>%
      dplyr::summarise(salary = mean(salary),
                score = mean(score)) %>%
      as.data.frame(.)
    rownames(df) <- NULL
    tibble::column_to_rownames(df,var='positionId')

    118.同时对salary、score两列进行计算

    res <- df %>%
      select(salary,score) %>%
      pivot_longer(c(salary,score),names_to = 'type',values_to = 'value') %>%
      group_by(type) %>%
      summarise(sum = sum(value),mean = mean(value),min = min(value))
    
    rownames(res) <- NULL
    
    res %>%
      column_to_rownames('type') %>%
      t(.)

    119.对不同列执行不同的计算

    对salary求平均,对score列求和

    df %>%
      summarise(salary_sum = sum(salary),
                score_mean = mean(score))

    120.计算并提取平均薪资最高的区

    df 

    点击下方链接,查看完整项目&数据集,及直接在线运行

    R语言数据处理120题​www.kesci.com
    展开全文
  • 生物信息工作的一大苦恼就是经常需要在各种语言之间切换,Java、Bash、R、Python、C/C++、Perl,甚至还有 H/ML5/CSS/Javascript,有些常用,有些隔数月乃至数年用到一次。以至于经常是逻辑上知道一个事情该怎么做,...

    生物信息工作的一大苦恼就是经常需要在各种语言之间切换,Java、Bash、R、Python、C/C++、Perl,甚至还有 H/ML5/CSS/Javascript,有些常用,有些隔数月乃至数年用到一次。以至于经常是逻辑上知道一个事情该怎么做,一个功能该怎么实现,却发现找不到合适的 API。尤其是 R 语言,由于和 Java/Python 这样的传统编程语言面向的主要应用场景不同,导致做同样事情的思路差异很大。偶然工作中遇到需要在 R 语言环境下调整 dataframe 列顺序的问题,网上粗略查了一下,多数是用 pandas 这样的第三方 package 来实现,但又懒得为这种小功能去安装 package,查阅 API。所幸找到了这个利用语言本身特性的方法,又谓好记性不如烂笔头,书之以备不时之用。

    # 得到 dataframe 的列名数组
    cols <- colnames(df)
    
    # 根据需要,生成新的列名顺序,例如,把倒数第一列插入到正数第二列之前,假设目前的列名顺序是
    # A B C D E F G H
    # 操作以后会变成
    # A H B C D E F G
    new_cols <- c(cols[1], cols[length(cols)], cols[2:(length(cols) - 1)])
    
    # 然后将 dataframe 按照新的列名顺序排列
    df <- df[, new_cols]
    
    展开全文
  • R语言数据集行列互换技巧

    万次阅读 2018-05-17 11:50:08
    现在给大家介绍的数据处理技巧是长转宽,也就相当于Excel中的转置,不过用R语言实现的长转宽还有数据合并的功能,自然比Excel强大多了。这里给大家介绍4个函数,其中melt()、dcast()来自reshape2包,gather()、...

    现在给大家介绍的数据处理技巧是长转宽,也就相当于Excel中的转置,不过用R语言实现的长转宽还有数据合并的功能,自然比Excel强大多了。

    这里给大家介绍4个函数,其中melt()、dcast()来自reshape2包,gather()、spread()来自tidyr包

    一、宽转长——melt()、gather()

    mydata<-data.frame(
      name=c("store1","store2","store3","store4"),
      address=c("普陀区","黄浦区","徐汇区","浦东新区"),
      sale2014=c(3000,2500,2100,1000),
      sale2015=c(3020,2800,3900,2000),
      sale2016=c(5150,3600,2700,2500),
      sale2017=c(4450,4100,4000,3200)
    )
    #宽转长——melt
    mydata1<-melt(
      mydata,
      id.vars=c("address","name"),#要保留的主字段
      variable.name = "Year",#转换后的分类字段名称(维度)
      value.name = "Sale" #转换后的度量值名称
    )

    输出结果

    > mydata1<-melt(
    +   mydata,
    +   id.vars=c("address","name"),#要保留的主字段
    +   variable.name = "Year",#转换后的分类字段名称(维度)
    +   value.name = "Sale" #转换后的度量值名称
    + )
    > mydata1
        address   name     Year Sale
    1    普陀区 store1 sale2014 3000
    2    黄浦区 store2 sale2014 2500
    3    徐汇区 store3 sale2014 2100
    4  浦东新区 store4 sale2014 1000
    5    普陀区 store1 sale2015 3020
    6    黄浦区 store2 sale2015 2800
    7    徐汇区 store3 sale2015 3900
    8  浦东新区 store4 sale2015 2000
    9    普陀区 store1 sale2016 5150
    10   黄浦区 store2 sale2016 3600
    11   徐汇区 store3 sale2016 2700
    12 浦东新区 store4 sale2016 2500
    13   普陀区 store1 sale2017 4450
    14   黄浦区 store2 sale2017 4100
    15   徐汇区 store3 sale2017 4000
    16 浦东新区 store4 sale2017 3200

    再来看看gather()函数怎么用

    > #宽转长——gather
    > mydata1<-tidyr::gather(
    +   data=mydata,
    +   key="Year",
    +   value="sale",
    +   sale2014:sale2017
    + )
    > mydata1
         name  address     Year sale
    1  store1   普陀区 sale2014 3000
    2  store2   黄浦区 sale2014 2500
    3  store3   徐汇区 sale2014 2100
    4  store4 浦东新区 sale2014 1000
    5  store1   普陀区 sale2015 3020
    6  store2   黄浦区 sale2015 2800
    7  store3   徐汇区 sale2015 3900
    8  store4 浦东新区 sale2015 2000
    9  store1   普陀区 sale2016 5150
    10 store2   黄浦区 sale2016 3600
    11 store3   徐汇区 sale2016 2700
    12 store4 浦东新区 sale2016 2500
    13 store1   普陀区 sale2017 4450
    14 store2   黄浦区 sale2017 4100
    15 store3   徐汇区 sale2017 4000
    16 store4 浦东新区 sale2017 3200

    和melt()函数不同,gather()函数需要指定关键字段key,以及关键字段对应的值value,但是gather()函数更加好理解。

    二、长转宽——dcast()和spread()

    还是用上面的data1数据集,先来看看dcast()函数

    #长转宽——dcast
    dcast(
      data=mydata1,
      name+address~Year
      #左侧是要保留的字段,右侧是要分割的分类变量,列数等于表达式
      #右侧分类变量的类别个数
    )
    > #长转宽——dcast
    > dcast(
    +   data=mydata1,
    +   name+address~Year
    +   #左侧是要保留的字段,右侧是要分割的分类变量,列数等于表达式
    +   #右侧分类变量的类别个数
    + )
    Using sale as value column: use value.var to override.
        name  address sale2014 sale2015 sale2016 sale2017
    1 store1   普陀区     3000     3020     5150     4450
    2 store2   黄浦区     2500     2800     3600     4100
    3 store3   徐汇区     2100     3900     2700     4000
    4 store4 浦东新区     1000     2000     2500     3200
    dcast()函数的使用规则需要琢磨下才能理解,大家好好看看注释部分,再来看看spread()

    #长转宽——spread
    tidyr::spread(
      data=mydata1,
      key=Year,
      value=sale
    )
    > #长转宽——spread
    > tidyr::spread(
    +   data=mydata1,
    +   key=Year,
    +   value=sale
    + )
        name  address sale2014 sale2015 sale2016 sale2017
    1 store1   普陀区     3000     3020     5150     4450
    2 store2   黄浦区     2500     2800     3600     4100
    3 store3   徐汇区     2100     3900     2700     4000
    4 store4 浦东新区     1000     2000     2500     3200

    直接调用tidyr::spread,需要指定关键字段key和对应的值value。

    但是从理解上来看,我个人更喜欢tidyr包的函数,使用很清晰,大家可以根据实际情况自行选择,好啦,今天的分享结束,下次再见!

    展开全文
  • R语言dplyr包和tidyr包创建交叉表(联表、crosstab)实战 目录 R语言dplyr包和tidyr包创建交叉表(联表、crosstab)实战 #dplyr包和tidyr包创建交叉表(联表、crosstab)的语法 #仿真数据 #dplyr包和...
  • R语言:矩阵

    2020-09-13 14:27:19
    R语言: 矩阵 R 语言为线性代数的研究提供了矩阵类型,这种数据结构很类似于其它语言中的二维数组,但 R 提供了语言级的矩阵运算支持。矩阵里的元素可以是数字、符号或数学式。 函数 说明 data 向量,矩阵的...
  • R语言行列操作、因子与数据集

    千次阅读 2021-05-22 07:06:09
    重命名行名/列名二、快捷键三、转因子四、数据集1、数据集创建(1)seq()(2)array(3)matrix2、划分数据集3、查看类型4、归一化五、运算符、判断六、包加载R语言数组等从1开始!一、行/操作1、取得/行名 行名同理,...
  • R语言矩阵的转化

    千次阅读 2020-12-25 13:24:08
    在使用R语言的过程中,我们会遇到很多问题,比如说长宽矩阵的转化,不能每一次都是手动处理,这样也很麻烦,实现长宽矩阵的转化的方式很多,我们只需要掌握其中一对就好。 1、宽变长 这里我随意设置一个矩阵,作为...
  • R语言数据科学】(十二):有趣的概率学(上)

    千次阅读 多人点赞 2022-06-16 14:17:00
    ✨本文收录于【R语言数据科学】本系列主要介绍R语言在数据科学领域的应用包括: R语言编程基础、R语言可视化、R语言进行数据操作、R语言建模、R语言机器学习算法实现、R语言统计理论方法实现。本系列会坚持完成下去...
  • R语言之数据获取

    2021-01-17 18:46:57
    rjson是一个R语言与json进行转的包,是一个非常简单的包,支持用C类库转型和R语言本身转型两种方式。rjson库,提供的函数只有3个,fromJSON(), newJSONParser(),toJSON()。JSON(JavaScript Object Notation)是一种轻...
  • 点击上方“早起Python”,关注并星标公众号和我一起玩Python本文为玩转数据处理120题|R语言版本习题|刘早起,解答|陈熹大家好,本文为R语言数据处理120题系列完整版本。作者精心挑选120道数据处理中相关操作以...
  • R语言之矩阵操作(2)

    千次阅读 2020-10-08 16:21:49
    A.s #矩阵奇异值分解 A.s$u%*%diag(A.s$d)%*%t(A.s$v) # a = udv’ 矩阵的和、维度和均值 a = matrix(1:15,3,5) dim(a) #维度 nrow(a) #行数 ncol(a) #数 sum(a) #求和 rowSums(a) #按行求和 colSums(a) #按求和...
  • 一、数组和字符串数组和字符串是最基本的数据结构,在很多编程语言中都有着十分相似的性质,这部分的算法面试题也是最多的。很多时候,在分析字符串相关面试题的过程中,要针对字符串当中的每一个字符进行分析和处理...
  • R语言可视化包ggplot2绘制分组箱图实战(Grouped Boxplot) 目录 R语言可视化包ggplot2绘制分组箱图实战(Grouped Boxplot) #仿真数据 #ggplot2绘制分组箱图 #ggplot2绘制分组箱图(交换分类变量) #ggplot...
  • 文章目录说明1. 新罗马字体、字体大小、加粗、标题居中2.排序倒序3.ggplot 按组排序和按水平排序4.修改图例移除图例5....这里以R自带的数据集mtcars说明ggplot绘图中一些常见技巧 mtcars数据摘自1974年《Motor Tren
  • linux下R语言与Hadoop的集成
  • R语言低级绘图函数-arrows

    千次阅读 2021-02-11 02:16:45
    col = "red", lwd = 2, lty = 3) 效果图如下: R语言低级绘图函数-symbols 严格意义上将symbols 并不能算是一个低级的绘图函数,因为它不仅可以在一幅已经存在的图标上添加元素,还可以创建一张新的图表 鉴于它绘图时...
  • 有时候我们要分析的数据可能不是来自一个数据集,...本专栏主要介绍R语言在数据分析领域的应用包括:R语言编程基础、R语言可视化、R语言进行数据操作、R语言建模、R语言机器学习算法实现、R语言统计理论方法实现。...
  • 广大R语言爱好者借助强大工具RHadoop,可以在大数据领域大展拳脚,这对R语言程序员来说无疑是个喜讯。 R是GNU的一个开源工具,具有S语言血统,擅长统计计算和统计制图。由Revolution Analytics发起的一个开源...
  • 而且还可以结合一些函数使用,比如desc(),实现按降序排列,desc的位置要在arrange函数里面哦 相比于前两个函数,select函数就是arrange的升级版,arrange函数即使实现了改变行的顺序的功能,但是如果没有被指定...
  • 1、背景 最近,在进行数据集的标准...对统计量的处理,比如,我们计算每一行/减去均值(均值中心化),或者除以均值(均值标准化)等,sweep行数就发挥作者用了。 sweep函数有效的替代了for循环 接下来,我们来讨
  • dplyr-tibble转换数据框的行名与向量
  • R语言数据可视化教程(ggplot2)_坐标轴设置

    万次阅读 多人点赞 2018-05-21 23:40:02
    坐标轴# 8.1交换x轴和y轴# 使用coord_flip()来翻转坐标轴library(ggplot2)ggplot(PlantGrowth,aes(x=group,y=weight))+geom_boxplot()ggplot(PlantGrowth,aes(x=group,y=weight))+geom_boxplot()+coord_flip()# 如果...
  • 基于R语言的Apriori算法应用案例 # 加载相关包 library(arules) data("Groceries") summary(Groceries) #-------------------查看数据集信息 class(Groceries) Groceries dim(Groceries) colnames...
  • R语言 关联规则

    万次阅读 2016-05-15 22:17:36
    R语言 关联规则 igraph包
  • R语言读入数据

    千次阅读 2017-05-04 17:04:51
    一、 R 导入文本文件   R中导入数据的基本命令是scan()。比较常用的命令有read.table()、read.csv()、read.fwf()等,这些命令其实在内部也是通过调用scan()实现的,它们可以看作是scan()的简化。 R从使用...
  • 点击上方“早起Python”,关注并星标公众号和我一起玩Python本文为玩转数据处理120题|R语言版本习题|刘早起,解答|陈熹大家好,本文为R语言数据处理120题系列完整版本。作者精心...
  • 并且每一题同时给出Pandas与R语言解法,同时针对部分习题给出了多种方法与注解。本系列一共涵盖了数据处理、计算、可视化等常用操作,动手敲一遍代码一定会让你有所收获!1创建DataFrame题目:将下面的字典创建为...
  • R语言数据输入输出

    万次阅读 2017-01-08 10:55:21
    R语言数据输入输出管理与程序设计方法。包括读取数据、文件,写到文件。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 42,573
精华内容 17,029
关键字:

交换列r语言