1

私が持っているもの:

私の最初の観察から…</p>

video_id  user_id keyword
1         1       foo
2         1       bar
3         1       baz
4         1       yak
1         2       foo
2         2       bar
3         2       blah
4         2       yak
1         3       foo
2         3       bar
3         3       blah
4         3       yak

…頻度(と呼ばれるtab)のテーブルがあり、希望どおりの形式で表示されます。たとえば、

video_id  foo bar baz yak blah
1         4   0   0   0   0
2         0   4   0   0   0
3         0   0   2   0   2
4         0   0   0   4   0

dataID列に基づいて、このテーブルを既存のデータフレーム(と呼ばれる)とマージしたいと思います。したがって、たとえば、他の2つの列も含まれています。

video_id  col1  col2
1         123   412
2         652   633
3         749   144
4         1738  1763

必要なもの:

ビデオIDに基づいて度数分布表と既存のデータフレームをマージする必要があります。必ずしも並べ替えられているとは限らないので、並べ替えることはできませんcbind。これは私が必要とする結果です:

video_id  col1  col2  foo bar baz yak blah
1         123   412   4   0   0   0   0
2         652   633   0   4   0   0   0
3         749   144   0   0   2   0   2
4         1738  1763  0   0   0   4   0

これで、次のようなデータフレームマトリックスを取得できることがわかりました。

as.data.frame.matrix(table(…))

しかし、このマトリックスにはvideo_id列がありません。これは、テーブルを表示したときに実際に表示されます。video_idでは、列または行の名前がまだ含まれているデータフレームを取得するにはどうすればよいですか?

video_id上記の例に示すように、最初にデータフレームに列を配置し、次に元の列を配置し、次に表形式のデータを追加する必要があります。

私が試したこと:

  • を介してテーブルの行名を取得できることはわかっていますrownames(table(…))。また、次の方法で必要な結果を取得できます。

    cbind(data.frame(video_id=rownames(tab)), as.data.frame.matrix(tab))
    

    しかし、これは私には(十分に)きれいに見えません。

  • と直接マージ

    merge(data, as.data.frame.matrix(tab))
    

    すべての結果が表示されますが、video_id列は表形式のデータと元のデータの間にあるため、正しい順序ではありません。

4

2 に答える 2

1

cbindとを含むアプローチは次のmatchとおりです。

データ:

df1 <- read.table(text="video_id  user_id keyword
1         1       foo
2         1       bar
3         1       baz
4         1       yak
1         2       foo
2         2       bar
3         2       blah
4         2       yak
1         3       foo
2         3       bar
3         3       blah
4         3       yak", header = TRUE)

tab <- table(df1[c("video_id", "keyword")])

        keyword
video_id bar baz blah foo yak
       1   0   0    0   3   0
       2   3   0    0   0   0
       3   0   1    2   0   0
       4   0   0    0   0   3


df2 <- read.table(text="video_id  col1  col2
1         123   412
2         652   633
3         749   144
4         1738  1763", header = TRUE)

解決策は次のとおりです。

cbind(df2, tab[match(df2$video_id, rownames(tab)), ])

結果:

  video_id col1 col2 bar baz blah foo yak
1        1  123  412   0   0    0   3   0
2        2  652  633   3   0    0   0   0
3        3  749  144   0   1    2   0   0
4        4 1738 1763   0   0    0   0   3
于 2012-12-23T12:21:50.320 に答える
1

私がしたこと:

data <- read.table(text = "video_id  col1  col2
1         123   412
2         652   633
3         749   144
4         1738  1763", header = TRUE)

tab <- read.table(text = "video_id  user_id keyword
1         1       foo
2         1       bar
3         1       baz
4         1       yak
1         2       foo
2         2       bar
3         2       blah
4         2       yak
1         3       foo
2         3       bar
3         3       blah
4         3       yak", header = TRUE)

tt <- aggregate(keyword ~ video_id, data = tab, FUN = table)
mrg <- merge(data, tt)
mrg

  video_id col1 col2 keyword.bar keyword.baz keyword.blah keyword.foo keyword.yak
1        1  123  412           0           0            0           3           0
2        2  652  633           3           0            0           0           0
3        3  749  144           0           1            2           0           0
4        4 1738 1763           0           0            0           0           3

これで、「奇妙な」列名ができました。あなたがそれと一緒に暮らすことができないならば、ここに「ハック」があります。

tmp <- data.frame(mrg$keyword)
mrg$keyword <- NULL
mrg <- cbind(mrg, tmp)

  video_id col1 col2 bar baz blah foo yak
1        1  123  412   0   0    0   3   0
2        2  652  633   3   0    0   0   0
3        3  749  144   0   1    2   0   0
4        4 1738 1763   0   0    0   0   3

編集

別の方法は次のとおりです。

tt2 <- tapply(X = tab$keyword, INDEX = tab$video_id, FUN = table, simplify = FALSE)
video_ajdi <- factor(names(tt2))
tt2 <- cbind(video_id = video_ajdi, do.call("rbind", tt2))
mrg <- merge(data, tt2)
mrg

  video_id col1 col2 bar baz blah foo yak
1        1  123  412   0   0    0   3   0
2        2  652  633   3   0    0   0   0
3        3  749  144   0   1    2   0   0
4        4 1738 1763   0   0    0   0   3

EDIT2

そしてもう1つ:

tt <- aggregate(keyword ~ video_id, data = tab, FUN = table)
tt3 <- do.call("cbind", tt)
merge(data, tt3)
于 2012-12-23T12:11:42.503 に答える