2012-11-17 2 views
2

У меня есть dataframe, который выглядит следующим образом:Получить уникальные комбинации значений с итоговым подсчетом других переменных

pred1 pred2 pred3 exp 
a  b  c  0 
a  d  c  0 
a  b  c  1 

То, что я хотел бы сделать, это сначала получить все уникальные комбинации pred1-3, записать их в дополнительную таблицу, добавьте столбец для частоты каждой комбинации и добавьте еще один столбец, который дает пропорцию значения 1 exp (которая может быть только 0 или 1) для каждой комбинации. Что-то вроде этого:

pred1 pred2 pred3 freq exp_prop 
a  b  c  2 0.5 
a  d  c  1 0 

Первые три шага оказался очень легко с plyr:

ddply(df, .(pred1, pred2, pred3), summarise, freq=length(exp)) 

или короче

count(df[,c(pred1, pred2, pred3)]) 

Но я просто не могу понять, как получить величины exp.

ответ

0
# read in your data 
x <- 
read.table(text="pred1 pred2 pred3 exp 
a  b  c  0 
a  d  c  0 
a  b  c  1" , h = T) 

library(sqldf) 
sqldf("select pred1, pred2, pred3, count(*) as numtimes, avg(exp) as prop from x group by pred1, pred2, pred3") 

###### alternative: 

# write all the column names according to some pattern 
cols <- paste0("pred" , 1:3 , collapse = ",") 

# save your data frame to another object 
y <- 
    sqldf( 
     paste( 
      "select" , 
      cols , 
      " , count(*) as numtimes, avg(exp) as prop from x group by" , 
      cols 
     ) 
    ) 

# print to screen 
y 
+0

Эй, это было быстро - большое спасибо! К сожалению, пакет sqldf, похоже, не работает на моем компьютере. Загрузка выполняется, но как только я ввожу какую-либо команду после этого, я получаю сообщение с сообщением «пойманная ошибка шины» и сбой R. Разве нет возможности сделать это с помощью родного синтаксиса R? – user1554977

+0

Предположим, вы используете mac? установите это, и он будет работать. sqldf - потрясающий пакет. http://r.789695.n4.nabble.com/sqldf-hanging-on-macintosh-works-on-windows-tp3022193p3022397.html –

1

Вы почти закончили. Просто добавьте exp_prop = mean(exp) в команду ddply:

ddply(df, .(pred1, pred2, pred3), summarise, 
     freq = length(exp), exp_prop = mean(exp)) 

    pred1 pred2 pred3 freq exp_prop 
1  a  b  c 2  0.5 
2  a  d  c 1  0.0 
+0

Это было легко. Благодаря! – user1554977

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