2017-06-09 19 views
2

この問題では、firstdigits(22番目の列)というデータセットデータ内の列を調べ、各値が何回発生するかを調べ、countという新しい列に入れようとしています(第27欄)。つまり、データ$ firstdigits = 1のどこにあっても、その行のデータ$ count = 5が必要な場所では、$ 1のデータが最初に5回出現します。ネストされたForループを最適化するR

私が思いついた方法はうまくいくかもしれませんが、それは私が知るためにまだ実行を完了していないので非常にclunky。私はこれを達成するためのより速い方法を探しています。

unique = as.data.frame(unique(data$firstdigits)) 
count = as.data.frame(0) 
for (i in 1:nrow(unique)){ 
    count[i,1] = sum(data$firstdigits == unique[i,1]) 
} 

data$count = 0 
for(j in 1:nrow(data)){ 
    for(k in 1:nrow(unique)){ 
    if (data[j,22] == unique[k,1]){ 
     data[j,27] == count[k,1] 
    } 
    } 
} 
+0

ここに記載されている回答のいずれかを使用したい場合があります:https://stackoverflow.com/questions/1923273/counting-the-number-of-elements-withベクトルのxの値。また、サンプルデータセットを提供することができれば、これは簡単に助けになります。データのほんの数列で 'dput()'と 'head()'の組み合わせを試してみてください。 – user5359531

答えて

3

たぶん、あなたは完全に、ネストされたループをドロップすることができます:

をあなたはdata$firstdigits内のすべての一意の値を通過し、その後data$countに出現回数を割り当てることができるループを使用する:

どう
## create count column if necessary 
# data$count <- 0 

for (v in unique(data$firstdigits)){ 

# number of occurences x 
x <- sum(data$firstdigits == v) 

data$count[data$firstdigits == v] <- x 

} 
0

約sqldf

library(sqldf) 

> df=NULL 
> df$col26=sample(100,100,T) 
> df=as.data.frame(df) 

> df2=sqldf("select count(col26) as col27,col26 from df group by col26") 
> df2=as.data.frame(df2) 

> str(df) 
'data.frame': 100 obs. of 1 variable: 
$ col26: int 21 49 99 100 46 72 32 84 44 100 ... 

> str(df2) 
'data.frame': 57 obs. of 2 variables: 
$ col27  : int 1 1 1 3 1 1 1 1 4 1 ... 
$ col26  : int 6 9 10 11 12 14 16 17 21 22 ... 

> df3=merge(df2,df,by="col26",all.y=TRUE) 

> str(df3) 
'data.frame': 100 obs. of 2 variables: 
$ col26  : int 6 9 10 11 11 11 12 14 16 17 ... 
$ col27  : int 1 1 1 3 3 3 1 1 1 1 ... 
0

あなたはtabledplyrを使用することができます。私はその後、私は新しい列

df <- df %>% 
     mutate(count = tbl.df[as.character(firstdigits)]) 

注意としてカウントをバインドするdplyr::mutateを使用して一意の値

tbl.df <- table(df$firstdigits) 
tbl.df 

0 1 2 3 4 5 6 7 8 9 10 
9 10 11 9 15 7 7 12 6 7 7 

をカウントするために使用table

df <- data.frame(firstdigits <- round(runif(100)*10)) 
df 

    firstdigits 
1   1 
2   7 
3   1 
4   2 
5   1 
6   0 

をデータフレームを構成していますよ文字値を使用してtbl.dfを索引付けします。 tbl.df[0]は有効なインデックスではありませんが、tbl.df["0"]は9を返します。

関連する問題