重新排序data.frame并重写rownames?

Joh*_*vat 3 r

我有一个像这样的data.frame:

id<-c("001-020", "001-010", "001-051")
name<-c("Fred", "Sue", "Liam")
df<-data.frame(id, name)
Run Code Online (Sandbox Code Playgroud)

我试过了:

df[with(df, order(id)), ]
#        id name
# 2 001-010  Sue
# 1 001-020 Fred
# 3 001-051 Liam
Run Code Online (Sandbox Code Playgroud)

它正确地对data.frame进行排序,但是没有触及rownames.

我如何使用id字段的升序重新排序data.frame并一次性重写rownames ?

akr*_*run 7

你可以试试

 newdf <- df[with(df, order(id)), ]
 row.names(newdf) <- NULL
Run Code Online (Sandbox Code Playgroud)

或者它可以一步完成

 newdf <- `row.names<-`(df[with(df,order(id)),], NULL)
Run Code Online (Sandbox Code Playgroud)

当您有一个空的data.frame时,设置row.namesNULL也可以.

  d1 <- data.frame()
  row.names(d1) <- NULL
  d1
  #data frame with 0 columns and 0 rows
Run Code Online (Sandbox Code Playgroud)

如果我们这样做的话 1:nrow

 row.names(d1) <-1:nrow(d1)
 #Error in `row.names<-.data.frame`(`*tmp*`, value = c(1L, 0L)) : 
 #invalid 'row.names' length
Run Code Online (Sandbox Code Playgroud)

或者另一个选择是 data.table

 library(data.table)#v1.9.4+
 setorder(setDT(df), id)[]
Run Code Online (Sandbox Code Playgroud)

要么

 setDT(df)[order(id)]
Run Code Online (Sandbox Code Playgroud)

或使用 sqldf

 library(sqldf)
 sqldf('select * from df
        order by id')
Run Code Online (Sandbox Code Playgroud)

  • 在v 1.9.5+中,你不需要`setDT`,只有v <1.9.5 (2认同)