2016-07-29 11 views
0

Ich habe vier Säulen:Griff Duplikat in R

A   B C D(column d equal column b divided by column c) 
apple(01) 1 6 1/6 
apple(78) 2 7 2/7 
apple(3) 3 8 3/8 
banana(12) 4 9 4/9 
banana  5 10 5/10 

Hier ist, was ich tun möchte. Ich möchte Klammern zuerst ignorieren. Zweitens möchte ich die doppelte Elemente B und C. Drittens möchte ich summieren neuen D. kommen

A   B  C  D(column d equal column b divided by column c) 
apple  1+2+3 6+7+8 (1+2+3)/(6+7+8) 
banana  4+5  9+10  (4+5)/(9+10) 

Wie kann ich dies tun in R?

Antwort

0

Wir können sub verwenden, um die Klammern in ‚A‘ zu entfernen, verwenden diese Variable als Gruppierungs, dann mit summarise_each, wir die sum von ‚B‘ erhalten, und ‚C‘ und schaffen die ‚D‘ Spalte ‚B Dividieren mit "C".

library(dplyr) 
df %>% 
    group_by(A = sub("\\(.*", "", A)) %>% 
    summarise_each(funs(sum), B:C) %>% 
    mutate(D = B/C) 
#  A  B  C   D 
# <chr> <int> <int>  <dbl> 
#1 apple  6 21 0.2857143 
#2 banana  9 19 0.4736842 

Oder wir Ihre Daten base R Methoden mit aggregate

transform(aggregate(.~A, transform(df, A = sub("\\(.*", "", A))[-4], sum), D = B/C) 
#  A B C   D 
#1 apple 6 21 0.2857143 
#2 banana 9 19 0.4736842 
+0

Vielen Dank @akrun! – bluesky0808

0

reinigen und machen können es ordentlich

df$A <- gsub("\\(.[0-9]*\\)$", "", df$A) 

Berechnung kommen Sie mit ordentlich Daten

library(data.table) 
setDT(df)[, .(B = sum(B), C = sum(C)), by = .(A)][, .(A, B, C, D = B/C)] 

#  A B C  D 
# 1: apple 6 21 0.2857143 
# 2: banana 9 19 0.4736842 
+0

Es funktioniert auch. Vielen Dank – bluesky0808