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