Re: [问题] data frame排序问题

楼主: celestialgod (天)   2016-11-01 20:49:35
※ 引述《locka (locka)》之铭言:
: [问题类型]:
:
: 程式咨询(我想用R 做某件事情,但是我不知道要怎么用R 写出来)
:
: [问题叙述]:
: 请简略描述你所要做的事情,或是这个程式的目的
: 各位大大们好:
: 想请教该怎么把一个 data frame 里面的row 按特定顺序重新排序
: 例如说我有一个 list factory_list 是a,b,c,d,e
: 然后我dataframe mydf是
: c 1000
: d 1500
: b 3000
: 我想要按照factory_list的顺序重新排序变成
: a 0
: b 3000
: c 1000
: d 1500
: e 0
: 当list跟mydf长度一样的时候我用 mydf[factory_list,] 可以正确排序
: 但当list长度不一样的时候就会出现问题
: 想了很久实在不知道该从何下手,烦请各位大大求解惑了 m(__)m
: *补充:
: 原本想自己重现问题可是却无法(结果不对)
: 所以后来是用dput把原始data印出来再修改
: 详细情形请见程式码
: (不知道差别在哪里...如果有大大知道为什么也欢迎指点!)
: 先谢谢大家了!!!
: [程式范例]:
:
: http://ideone.com/YmgnI7
:
: [关键字]:
:
: data frame, 排序
用merge跟match就可以达到你要的效果了
library(data.table)
library(pipeR)
factory_list_dt <- data.table(factory = c("台北", "台中", "高雄",
"新竹", "台南"))
dt1 <- data.table(factory = c("台北", "高雄", "新竹", "台中", "台南"),
rev = c(9.23913043478261,16.3571428571429,
15.6206896551724, 15.0980392156863, 10))
dt1_sorted <- merge(factory_list_dt, dt1, by = "factory", all.x = TRUE) %>>%
`[`(match(factory_list_dt$factory, factory))
print(dt1_sorted)
# factory rev
# 1: 台北 9.23913
# 2: 台中 15.09804
# 3: 高雄 16.35714
# 4: 新竹 15.62069
# 5: 台南 10.00000
dt2 <- data.table(factory = c("台北", "台中", "高雄"),
rev = c(9.23913043478261,16.3571428571429, 15.6206896551724))
dt2_sorted <- merge(factory_list_dt, dt2, by = "factory", all.x = TRUE) %>>%
`[`(match(factory_list_dt$factory, factory)) %>>%
`[`(j = rev := ifelse(is.na(rev), 0, rev))
print(dt2_sorted)
# factory rev
# 1: 台北 9.23913
# 2: 台中 16.35714
# 3: 高雄 15.62069
# 4: 新竹 0.00000
# 5: 台南 0.00000
作者: locka (locka)   2016-11-01 20:57:00
感谢celestialgod大大,回到家来研究看看不过如果我原始的factory_list不是data.table的话怎么办呢我原始的factory_list其实是用readOGR下载的地图中的某字段之后要拿来作图 不确定把factory_list改成dt后能不能用我回家再试试看!!
作者: cywhale (cywhale)   2016-11-01 22:07:00
如果DT中有factory字段 setkey(DT,factory) 然后你有原来的factorlist, DT[factorlist, nomatch=NA]再把NA改0即可如果只有dataframe, out<-df[match(lf,rownames(df)),]再把out[is.na(out)]<-0和rownames加回去应也不会太麻烦?

Links booklink

Contact Us: admin [ a t ] ucptt.com