作者celestialgod (天)
看板R_Language
标题Re: [问题] data frame排序问题
时间Tue Nov 1 20:49:35 2016
※ 引述《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
--
R资料整理套件系列文:
magrittr #1LhSWhpH (R_Language) https://goo.gl/OBto1x
data.table #1LhW7Tvj (R_Language) https://goo.gl/QFtp17
dplyr(上.下) #1LhpJCfB,#1Lhw8b-s (R_Language) https://goo.gl/GcfNoP
tidyr #1Liqls1R (R_Language) https://goo.gl/pcq5nq
pipeR #1NXESRm5 (R_Language) https://goo.gl/cDIzTh
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 36.234.177.169
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/R_Language/M.1478004578.A.2C7.html
1F:推 locka: 感谢celestialgod大大,回到家来研究看看 11/01 20:57
2F:→ locka: 不过如果我原始的factory_list不是data.table的话怎麽办呢 11/01 20:58
3F:→ locka: 我原始的factory_list其实是用readOGR下载的地图中的某栏位 11/01 21:01
4F:→ locka: 之後要拿来作图 不确定把factory_list改成dt後能不能用 11/01 21:02
5F:→ locka: 我回家再试试看!! 11/01 21:03
6F:推 cywhale: 如果DT中有factory栏位 setkey(DT,factory) 然後你有原来 11/01 22:07
7F:→ cywhale: 的factorlist, DT[factorlist, nomatch=NA]再把NA改0即可 11/01 22:09
8F:推 cywhale: 如果只有dataframe, out<-df[match(lf,rownames(df)),] 11/01 22:10
9F:→ cywhale: 再把out[is.na(out)]<-0和rownames加回去应也不会太麻烦? 11/01 22:12