我有一个像这样的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 ?
你可以试试
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.names为NULL也可以.
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)