按列值对数据框中的行值进行排序

时间:2018-09-13 10:22:25

标签: r sorting dplyr

我很难按特定列对行值进行排序。 值具有不同的顺序,例如,

 METHOD  VAL1  VAL2  VAL3
    1-A     10    2     15
    10-B    11    5     15
    11-c    23    45    65
    2-F     4     65    67
    3-T     4     56    11

我需要这样

 METHOD  VAL1  VAL2  VAL3
    1-A     10    2     15
    2-F     4     65    67
    3-T     4     56    11 
    10-B    11    5     15
    11-c    23    45    65

排序顺序基于METHOD列。我试图以多种方式来安排它,但没有成功。

我已经解决了这个问题,但是在同一代码上还有另一个问题。单独地,以下代码有效,但是将其应用于功能时会产生问题。

a1 <-  a1[order(as.numeric(gsub("-.*", "", a1$varname))),]

我的功能如下,

t1<- doTable1(AE_subset$Disp_code,AE_subset$FY,"DisposalMethod",thresh = 0.02,testvar = AE_subset$Attendance,fun="sum")


doTable1<- function(var1,var2,varname,testvar=NULL,fun=NULL,inc=TRUE,thresh=0.02) {

  if (is.null(fun)) {
    a1<- as.data.frame.matrix(table(var1,var2))
  } else {
    a1<- as.data.frame.matrix(tapply(testvar,list(var1,var2),FUN=fun,na.rm=TRUE))
  }

  a1<- rownames_to_column(a1,var=varname)

  a1$FY3PR<- a1$FY3*proRata



  if (!is.null(fun))
    if (fun=="mean")
      a1$FY3PR<- a1$FY3


  a1 <-  a1[order(as.numeric(gsub("-.*", "", a1$varname))),]  # dataframe is not updating here

  a1 <- a1 %>% replace(., is.na(.), 0)
  a1 <- rbind(a1,c("Total",as.numeric(colSums(a1[,2:4]))))


  return(a1)

}

简单,它返回NULL数据帧。 有人能确定为什么在order()命令中此函数失败的原因吗?

2 个答案:

答案 0 :(得分:0)

您可以使用gsub从字符中分离数字,然后order将它们分开:

df[order(as.numeric(gsub("-.*", "", df$METHOD))),]

  METHOD VAL1 VAL2 VAL3
1    1-A   10    2   15
4    2-F    4   65   67
5    3-T    4   56   11
2   10-B   11    5   15
3   11-c   23   45   65

答案 1 :(得分:0)

使用dplyr,您可以执行以下操作:

library(dplyr)
dat %>% # we create a new column based on METHOD
  mutate(met_num =as.numeric(gsub("\\D", "", METHOD)) ) %>% # gets only the number part 
  arrange(met_num) %>%  # we arrange just by the number part of METHOD
  select(-met_num) # removes that new column

  METHOD VAL1 VAL2 VAL3
1    1-A   10    2   15
2    2-F    4   65   67
3    3-T    4   56   11
4   10-B   11    5   15
5   11-c   23   45   65

使用的数据:

tt <- "METHOD  VAL1  VAL2  VAL3
    1-A     10    2     15
10-B    11    5     15
11-c    23    45    65
2-F     4     65    67
3-T     4     56    11"

dat <- read.table(text = tt, header = T)