2016-10-04 4 views
1

新しいfrequency列を作成し、それぞれの固有値の合計数をitemに入力します。私は試しました:別の列に一意の値の頻度で1つの列を入力してください

df$frequency <- sum(df$item) #gives me total sum 
df$frequency <- sum(unique(df$item)) # gives me 6 for some reason 
df$frequency <- sum(df$item == 1) #gives me total count per selected value 

しかし、私は本当に一度にそれらを生成したいと思います。

例データ:

> df <- data.frame("item" = c(1,1,1,1,2,2,2,3)) 
> df 
    item 
1 1 
2 1 
3 1 
4 1 
5 2 
6 2 
7 2 
8 3 

所望の出力:事前に

> df 
    item frequency 
1 1   4 
2 1   4 
3 1   4 
4 1   4 
5 2   3 
6 2   3 
7 2   3 
8 3   1 

本当にありがとうございました!

答えて

4

あなたはあなたがdata.tableで試すことができtable

df$frequency <- table(df$item)[df$item] 

# item frequency 
#1 1   4 
#2 1   4 
#3 1   4 
#4 1   4 
#5 2   3 
#6 2   3 
#7 2   3 
#8 3   1 

それともave

df$frequency <- ave(1:nrow(df), df$item, FUN = length) 
+1

2番目の方がより堅牢です。たとえば、 'df < - data.frame(" item "= c(5,1,2,2,2,5,4))'が最初の提案では機能しません。 – Henry

+0

@Henry Ohh ..そうですか!素晴らしい観察。ありがとう。 –

0

このようなものが欲しいですか?

df <- data.frame("item" = c(2,2, 1,1,1,1,2,2,2,3)) 
df <- data.frame(item=df[order(df$item),]) # if items are not ordered 
df$frequency <- as.integer(rep(table(df), table(df))) 
df 
    item frequency 
1  1   4 
2  1   4 
3  1   4 
4  1   4 
5  2   5 
6  2   5 
7  2   5 
8  2   5 
9  2   5 
10 3   1 
+3

アイテム列が発注されていない場合、これは機能しません。 itemカラムが 'c(2,2,1,1,1,2,2,2,3)'の場合などです。 – 9Heads

+0

あなたの例では、列が順序付けられていると仮定していますが、そうでない場合は、順序を変更することはできませんか? –

+0

しかし、データセット内の他の列があると仮定してアイテム列のデータセットをソートしたくないのに対し、他の答えは注文に関係なく正しい答えを返します。 – 9Heads

1

とを使用することができます。itemにより、項目の合計数にcorrresponds列frequencyを作成します。

library(data.table) 
setDT(df)[, frequency:=.N, by=item] 
df 
# item frequency 
#1: 1   4 
#2: 1   4 
#3: 1   4 
#4: 1   4 
#5: 2   3 
#6: 2   3 
#7: 2   3 
#8: 3   1 
関連する問題