Классифицируйте или вырезать dataframe по списку диапазона классов и суммируйте его с ddply

StackOverflow https://stackoverflow.com/questions/3883607

  •  28-09-2019
  •  | 
  •  

Вопрос

У меня есть вопрос о DDPLY и подмножестве.

У меня есть DataFrame DF, как это:

df <- read.table(textConnection(
"   id v_idn v_seed v_time v_pop v_rank v_perco 
    1  15    125648 0      150   1      15      
    2  17    125648 0      120   2      5       
    3  18    125648 0      100   3      6       
    4  52    125648 0      25    4      1       

    5  17    125648 10     220   1      5      
    6  15    125648 10     160   2      15       
    7  18    125648 10     110   3      6      
    8  52    125648 10     50    4      1       

    9  56   -11152  0      250   1      17      
    10 15   -11152  0      180   2      15      
    11 18   -11152  0      110   3      6       
    12 22   -11152  0      5     4      14      

    13 56   -11152  10     250   1      17      
    14 15   -11152  10     180   2      15      
    15 22   -11152  10     125   3      14      
    16 18   -11152  10     120   4      6 "), header=TRUE)      

ШАГ ПЕРВЫЙ :

У меня есть список равных интервалов с помощью cut_interval, как это:

myinterval <- cut_interval(c(15,5,6,1,17,14), length=10)  

Поэтому у меня здесь два уровня: [0,10) и (10,20

ШАГ ВТОРОЙ :

Я хочу, чтобы каждая группа / класс определяет мои два уровня в V_CUT ... Как это:

id v_idn v_seed v_time v_pop v_rank v_perco v_cut
1  15    125648 0      150   1      15      (10,20]
2  17    125648 0      120   2      5       [0,10)
3  18    125648 0      100   3      6       [0,10)
4  52    125648 0      25    4      1       [0,10)

5  17    125648 10     220   1      5       [0,10)
6  15    125648 10     160   2      15      (10,20] 
7  18    125648 10     110   3      6       [0,10)
8  52    125648 10     50    4      1       [0,10)

9  56   -11152  0      250   1      17      (10,20]
10 15   -11152  0      180   2      15      (10,20]
11 18   -11152  0      110   3      6       [0,10)
12 22   -11152  0      5     4      14      (10,20]

13 56   -11152  10     250   1      17      (10,20]
14 15   -11152  10     180   2      15      (10,20]
15 22   -11152  10     125   3      14      (10,20]
16 18   -11152  10     120   4      6       [0,10)

ШАГ 3 :

Я хочу знать изменчивость v_rank for x axis, а время оси y, для каждой группы v_cut, поэтому мне нужно вычислить мин, среднее значение max, sd для v_rank ценность с чем-то вроде

ddply(df, .(v_cut,v_time), summarize ,mean = mean(v_rank), min = min(v_rank), max = max(v_rank), sd = sd(v_rank))

*Результат хотел: *

id  v_time MEAN.v_rank ... v_cut
1   0      2.25            (10,20]
2   0      2.42            [0,10)
3   10     2.25            [0,10)
4   10     2.42            (10,20]

МОЯ ПРОБЛЕМА

Я не знаю, как пройти шаг 1 -> Шаг 2: /

И если можно группировать V_CUT, как мой пример на шаге 3?

Есть ли возможность сделать то же самое с «подмножественным» вариантом DDPLY?

Еще раз, большое спасибо за вашу помощь великой Гуру!

Обновление 1:

У меня есть ответ на шаг 1 на шаг2:

df$v_cut <- cut_interval(df$v_perco,n=10)

Я использую Plyr, но есть, возможно, лучший ответ в этом случае?

Ответьте, чтобы пойти на шаг 2 на шаг 3?

Обновление 2:

Брэндон Бертелисен дай мне хороший ответ с талым + литой, но сейчас (понять) я хочу сделать ту же операцию с PLYR и DDPLY .. с другим результатом:

id  v_idn v_time MEAN.v_rank ... v_cut
    1   15   0      2.25            (10,20]
    2   15   10     2.45            (10,20]
    2   17   0      1.52            [0,10)
    2   17   10     2.42            [0,10)
    etc. 

Я пытаюсь с чем-то вроде этого:

r('sumData <- ddply(df, .(v_idn,v_time), summarize,min = min(v_rank),mean =  mean(v_rank), max = max(v_rank), sd=sd(v_rank))')

Но я хочу иметь v_cut в моем dataframe sumdata, как я могу сделать с ddply? Есть ли возможность сделать это? Или слияние с начальными df и ключом = v_idn, чтобы добавить столбец v_cut в sumdata - единственный хороший ответ?

Это было полезно?

Решение

Вам не нужен PLYR для этого, вы можете использовать reshape

## Pull what you need
dfx <- df[c("v_seed", "v_time","v_rank","v_perco")]
## Bring in your cuts
dfx <- data.frame(dfx, ifelse(df$v_perco > 10,"(10,20]", "[0,10)")))
## Rename v_cut
colnames(dfx)[ncol(dfx)] <- "v_cut"       
## Melt it.    
dfx <- melt(dfx, id=c("v_cut", "v_seed", "v_time"))
## Cast it.
dfx <- cast(dfx, v_cut + v_time + v_seed ~ variable, c(mean,min,max,sd))

Если вы хотите только хотите среднее, затем замените последнюю строку с помощью:

dfx <- cast(dfx, v_cut + v_time + v_seed ~ variable, mean)

Введите «DFX», и вы увидите кадр данных с тем, что вы просили.

Другие советы

У вас просто проблема с синтаксисом - это все:

## Add your cut
df.new <- data.frame(df, ifelse(df$v_perco > 10,"(10,20]", "[0,10)"))
## Rename v_cut
colnames(df.new)[ncol(df.new)] <- "v_cut"   

## Careful here read the note below
df.new <- ddply(df.new, .(v_idn, v_time), function(x) unique(data.frame(
mean =  mean(x$v_rank),
v_cut = x$v_cut
)))

В качестве альтернативы:

ddply(df.new, .(v_idn, v_time), summarise, mean=mean(v_rank))

С ". (V_idn, v_time)" вы говорите, что для каждой комбинации v_idn и v_time вы хотите, чтобы он рассчитывал среднее значение v_rank.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top