简体   繁体   中英

Sorting dataframe by column of letters and numbers

I have been attempting to sort my dataframe by the first column - or day - with multiple different methods listed below to no avail. I suspect it could be because it is attempting to order by the first number but I am unsure how I would change that to get it to order the rows properly. The dataset is as follows:

df1
    [day][sample1][sample2]
[1,]day0    22       11
[2,]day11   23       15
[3,]day15   25       14
[4,]day2    21       13
[5,]day8    20       17
...

I am looking to order the entire row by day. I have tried the following

df[sort(as.character(df$day)),]
df[order(as.character(df$day)),]
mixedorder(as.character(df$day))   (gtools package)

The mixedorder merely output an index of numbers.

Current Code:

df_0$day =  metadata_df[,3]
df_0 <- df_0[,c(8,1:7)]
df1 <- aggregate(df_0[,2:ncol(df_0)], df_0[1], mean)
df1 <- df1[mixedorder(as.character(df1$day)),]
df1$day <- factor(df1$day, levels = unique(df1$day))
rownames(df1) <- 1:nrow(df1)
##Plotting expression levels
Plot1 <- ggplot() +
  geom_line(data=df1, aes(x=day, y=sample1, group=1, color="blue"))+
  geom_line(data=df2, aes(x=day, y=sample1, group=2, color="red"))

Note that I have done the same transformations with df2 as I have with df1. Both df1 and df2 are the same, except with slightly different values in them.

The mixedorder gives the ordered index which can be used to order the rows

df1 <- df[mixedorder(as.character(df$day)),]
df1
#     day sample1 sample2
#1  day0      22      11
#4  day2      21      13
#5  day8      20      17
#2 day11      23      15
#3 day15      25      14

It is not clear about how the OP is plotting.

library(tidyverse)
df1 %>%
    mutate(day = factor(day, levels = unique(day))) %>% 
    gather(key, val, -day) %>%
    ggplot(., aes(x = day, y = val, color = key)) + 
          geom_point() 

在此输入图像描述

data

df <- structure(list(day = structure(1:5, .Label = c("day0", "day11", 
"day15", "day2", "day8"), class = "factor"), sample1 = c(22L, 
23L, 25L, 21L, 20L), sample2 = c(11L, 15L, 14L, 13L, 17L)), .Names = c("day", 
 "sample1", "sample2"), class = "data.frame", row.names = c(NA, 
-5L))

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM