2017-01-28 2 views
0

Ich habe einen Datensatz mit über 100 000 Zeilen. Ich möchte für jede Zeile eine Anzahl von Auftritten in einer bestimmten Spalte finden und sie in einer anderen Spalte speichern (siehe Beispiel unten).R zählen und speichern die Anzahl der Duplikate in einer anderen Spalte

Ich könnte durch den gesamten Datensatz für jede Zeile durchlaufen, aber das wäre 100k * 100k Iterationen. Gibt es dafür einen effizienteren Weg?

Eingabedatensatz

A B 
1 6 
3 1 
2 6 
4 2 
1 4 
9 1 

Output-Datensatz

A B number_of_appearances (based on column B) 
1 6 2 
3 1 2 
2 6 2 
4 2 1 
1 4 1 
9 1 2 

Antwort

1

Und ohne dplyr:

# create the dataframe 
x = sample(1:3, 10, TRUE); 
y = sample(c("a","b","c"), 10, TRUE); 
d = data.frame(x,y); 

# get the frequencies of y 
tb = table(d$y); 
tb = as.data.frame(tb); 

# make an "SQL join-like" merging of the two data-frames 
res = merge(d,tb,by.x="y",by.y="Var1", sort=FALSE); 
1

Sie dplyr dafür verwenden können:

library(dplyr) 

a <- c(2,1,2,3,4,3,2,1,4) 
b <- c(3,2,1,2,3,4,3,2,1) 

df <- data.frame(a, b) 

df %>% 
    group_by(b) %>% 
    mutate(appearences_in_b = n()) 

Source: local data frame [9 x 3] 
Groups: b [4] 

    a  b appearences_in_b 
    <dbl> <dbl>   <int> 
1  2  3    3 
2  1  2    3 
3  2  1    2 
4  3  2    3 
5  4  3    3 
6  3  4    1 
7  2  3    3 
8  1  2    3 
9  4  1    2 
0

einfach den data.table Ansatz hinzuzufügen:

library(data.table) 
dt <- data.table(A = c(1, 3, 2, 4, 1, 9), B = c(6, 1, 6, 2, 4, 1)) 

dt[, number_of_appearances := .N, by = "B"] 

print(dt) 
    A B number_of_appearances 
1: 1 6      2 
2: 3 1      2 
3: 2 6      2 
4: 4 2      1 
5: 1 4      1 
6: 9 1      2 
1

Wir ave von base R

df1$appearance_in_b <- with(df1, ave(B, B, FUN=length)) 
df1$appearance_in_b 
#[1] 2 2 2 1 1 2 
verwenden können
Verwandte Themen