2014-01-17 2 views
2

У меня многослойного фрейм данныхпоместить значение кадра данных в R

a <- c(1,1,1,1,2,2,3,3,3,3,3,4,4,4,4) 
b <- c(200,201,201,200,220,220,200,220,203,204,204,203,220,200,200) 
d <- c(500,500,500,500,500,501,501,501,501,501,502,502,502,502,502) 
f <- c("G","G","M","M", "G","G","M","M","M","G","M","G","M","G","G") 
df <- data.frame(a,d,b,f) 

я использую dcast от reshape2, чтобы поместить значение данных следующего

dcast(df,a+d+b ~ f) 
     a  d b G M 
1  1 500 200 1 1 
2  1 500 201 1 1 
3  2 500 220 1 0 
4  2 501 220 1 0 
5  3 501 200 0 1 
6  3 501 203 0 1 
7  3 501 204 1 0 
8  3 501 220 0 1 
9  3 502 204 0 1 
10 4 502 200 2 0 
11 4 502 203 1 0 
12 4 502 220 0 1 

он по умолчанию длине, так как я не кладям агрегирующая функция. То, что я хотел бы, однако, чтобы получить

a d b col_1 col_2 
1 500 200 G  M 
1 500 201 G  M 
2 500 220 G NA 
...and so on 

я хочу «расширить» или поместить значение кадра данных перестановки столбца f для конкретной комбинации a+d+b и добавляет его к раме. Есть ли элегантный способ без необходимости перебирать комбинации?

EDIT: Не обязательно только 2 уровня G & M в col f. Я просто хочу поставить col_1col_2col_3, который перенесет столбец f на уникальную комбинацию a+d+b. Я сделал это с циклом for; но с большим набором данных он громоздкий. Я искал код быстрее!

+0

Пожалуйста, простите мой хромой вопрос, но когда вы говорите, «У меня есть многослойную кадр данных», что вы имеете в виду под «сложены»? Для меня это выглядит как обычный фрейм. Какая разница? –

ответ

3
dcast(df, a+d+b ~ f, fun.aggregate = function(x) as.character(x)[1]) 
#Using f as value column: use value.var to override. 
# a d b G M 
#1 1 500 200 G M 
#2 1 500 201 G M 
#3 2 500 220 G <NA> 
#4 2 501 220 G <NA> 
#5 3 501 200 <NA> M 
#6 3 501 203 <NA> M 
#7 3 501 204 G <NA> 
#8 3 501 220 <NA> M 
#9 3 502 204 <NA> M 
#10 4 502 200 G <NA> 
#11 4 502 203 G <NA> 
#12 4 502 220 <NA> M 

Re комментарий: может быть, вы хотите, чтобы это потом:

library(data.table) 
dt = data.table(df) 

dt[, lapply(1:3, function(i) as.character(f)[i]), by = list(a, d, b)] 
# a d b V1 V2 V3 
# 1: 1 500 200 G M NA 
# 2: 1 500 201 G M NA 
# 3: 2 500 220 G NA NA 
# 4: 2 501 220 G NA NA 
# 5: 3 501 200 M NA NA 
# 6: 3 501 220 M NA NA 
# 7: 3 501 203 M NA NA 
# 8: 3 501 204 G NA NA 
# 9: 3 502 204 M NA NA 
#10: 4 502 203 G NA NA 
#11: 4 502 220 M NA NA 
#12: 4 502 200 G G NA 
+0

Извинения за неясность. Столбец «f» не обязательно имеет 2 уровня. как это бывает, в моей фактической длине набора данных (unique (df $ f)) равно 102. Однако для одной уникальной комбинации a + d + b я знаю, что не более трех строк! То, что я ищу, - это то, что будет просто горизонтально стекаться против уникальных комбинаций + d + b! – satya

+0

@satya iiuc что вы хотите - см. Редактировать – eddi

+0

работал чудесно! большое спасибо @eddi. Я должен прочитать о применении функций. Один вопрос, зачем нужно преобразовывать df в dt? – satya

Смежные вопросы