Re: [問題] 資料處理的問題

作者: celestialgod (天)   2015-12-25 16:37:33
※ 引述《PILIPALAPON (pilipalapon)》之銘言:
: [問題類型]:
: 程式諮詢(我想用R 做某件事情,但是我不知道要怎麼用R 寫出來)
: [軟體熟悉度]:
: 新手(沒寫過程式,R 是我的第一次)
: 懂一些簡單的指令
: [問題敘述]:
: 現在有一個資料檔
: ID age sex num
: 1 30 1 4
: 1 20 1 4
: 1 21 2 4
: 1 32 2 4
: 1 48 2 4
: 2 23 1 2
: 2 46 1 2
: 2 21 1 2
: 3 23 2 2
: 3 71 2 2
: 3 32 1 2
: 4 56 2 1
: 4 12 2 1
: 我要同ID的依照num變數做選取,例如ID=1,num=4,那我要取ID=1的第四列觀測值。ID=2
: ,num=2,那我要取ID=2的第二列觀測值,以次類推...
: 預期結果如下
: ID age sex num
: 1 32 2 4
: 2 46 1 2
: 3 71 2 2
: 4 56 2 1
:
library(plyr)
library(dplyr)
library(magrittr)
# data generation
set.seed(100)
numID = 5
N = 20
dat = data.frame(ID = sample(1:numID, N, TRUE), age = sample(10:50, N, TRUE),
sex = sample(1:2, N, TRUE)) %>% group_by(ID) %>%
mutate(num = sample(1:length(age), 1)) %>% arrange(ID, sex, age)
# ID age sex num
# 1 1 21 1 1
# 2 1 40 2 1
# 3 2 17 1 6
# 4 2 24 1 6
# 5 2 31 1 6
# 6 2 35 1 6
# 7 2 49 1 6
# 8 2 39 2 6
# 9 2 46 2 6
# 10 2 50 2 6
# 11 3 17 1 4
# 12 3 32 1 4
# 13 3 27 2 4
# 14 3 32 2 4
# 15 4 15 1 3
# 16 4 30 1 3
# 17 4 46 1 3
# 18 4 38 2 3
# 19 5 48 1 1
# 20 5 41 2 1
# dplyr解法:
dat %>% group_by(ID) %>% summarise_each(funs(.[unique(num)]))
# ID age sex num
# 1 1 21 1 1
# 2 2 39 2 6
# 3 3 32 2 4
# 4 4 46 1 3
# 5 5 48 1 1
# 一般解法:
split(dat, dat$ID) %>% lapply(function(subdf) subdf[unique(subdf$num),]) %>%
do.call(rbind, .)
# ID age sex num
# 1 1 21 1 1
# 2 2 39 2 6
# 3 3 32 2 4
# 4 4 46 1 3
# 5 5 48 1 1
上面其實跟以下相等:
do.call(rbind, lapply(split(dat, dat$ID),
function(subdf) subdf[unique(subdf$num),])
新手的話,我再補一個for loop解法:
# for loop
numID = length(unique(dat$ID))
outDF = data.frame(matrix(NA, numID, ncol(dat)))
names(outDF) = names(dat)
for (i in 1:numID)
{
rowNum = unique(dat[dat$ID == i, ]$num)
outDF[i,] = dat[dat$ID == i, ][rowNum, ]
}
outDF
# ID age sex num
# 1 1 21 1 1
# 2 2 39 2 6
# 3 3 32 2 4
# 4 4 46 1 3
# 5 5 48 1 1
作者: locka (locka)   2015-12-26 00:17:00
推c大!
作者: yu8861213 (Drumer)   2015-12-27 21:38:00
推C大
作者: Wush978 (拒看低質媒體)   2015-12-27 23:55:00
push
作者: cywhale (cywhale)   2015-12-29 15:07:00
dplyr解法漂亮~~
作者: andrew43 (討厭有好心推文後刪文者)   2015-12-29 17:02:00
c大,我寫在 #1LaqCq5O 的爬文器顯示你已經是水神等級了

Links booklink

Contact Us: admin [ a t ] ucptt.com