3

私はRプログラミング言語が初めてです。次のような2つの列(IDとNum)を持つデータセットがあります:

ID    Num
3       8
3      12
4      15
4      18
4      24

しかし、私はそれを次のように変換したい:

ID    Num
3     8 12
4     15 18 24

3 と 4 はまだ列 'ID' にありますが、8 と 12 は互いに近い 1 つの行にあり、3 の 'ID' を持つ 'Num' 列にあります。また、4 は列 'ID' にあり、15 18 と 24 はにありますIDが4の「Num」列にある互いに近い1行。元のデータセットをこの新しいタイプに変換するのを手伝ってくれる人はいますか。私はたくさん検索しましたが、この問題の R コードはどこにも見つかりませんでした。

4

3 に答える 3

3

使用することもできますaggregate

> aggregate(DF$Num~DF$ID, FUN=paste, sep=" ")
  DF$ID     DF$Num
1     3      8, 12
2     4 15, 18, 24

data =または、パラメーター ofを使用aggregateして、列名にDF$.

aggregate(data=DF, Num~ID, FUN=paste, sep=" ")
#   ID        Num
# 1  3      8, 12
# 2  4 15, 18, 24
于 2013-06-08T08:05:37.183 に答える
1

取得したいデータ形式の問題は、さまざまな数の列が必要なことです。もちろん、各 に最大 3 つの値がある場合はid、3 つの列を追加するだけで済みます。しかし、それはかなり複雑になりid、たとえば 100 の値を持つ s の処理が難しくなります。

途中でリストを使用することです。ここで、列数は固定されなくなりました。

リストで必要なものをアーカイブする方法は難しくありません。

d <- data.frame(id=c(3,3,4,4,4), num=c(8,12,15,18,24))  # Just your sample data
l <- with(d, tapply(num, id, c))

上はどうなりますか?with入力する必要がなく、実際のソリューションには何もしませんd$numd$id鍵は にありますtapply。ここでは、numbyのすべての値をグループ化し、それらのグループを個別にid呼び出します。次に、出力を収集し、結果の値に最適なデータ構造を返します。この場合はリストです。結果:ctapply

> l
$`3`
[1]  8 12

$`4`
[1] 15 18 24

を使用してパーツのみを照会できます

> l[[1]]      # The first element in the list
[1]  8 12
> l[['3']]    # The element with key (id) `3`
[1]  8 12

もう1つの方法。数値を単一の列に文字列として貼り付けたい場合は、もちろんこれも可能です。

> with(d, tapply(num, id, paste, collapse=' '))
         3          4 
    "8 12" "15 18 24" 
于 2013-06-08T07:29:08.797 に答える
1

または、列をリストにしたい場合は、次のNumようにすることができます。

使用by:

do.call(rbind, by(df, df$ID, FUN=function(x) 
             data.frame(ID=x$ID[1], Num = I(list(x$Num)))))

#   ID        Num
# 3  3      8, 12
# 4  4 15, 18, 24

またはsplit+を使用lapply:

do.call(rbind, lapply(split(df, df$ID), function(x) 
               data.frame(ID=x$ID[1], Num=I(list(x$Num)))))

またはplyrパッケージを使用:

require(plyr)
ddply(df, .(ID), function(x) data.frame(ID = x$ID[1], Num = I(list(x$Num))))

またはdata.tableパッケージを使用:

require(data.table)
dt <- as.data.table(df)
dt[, list(Num = list(Num)),by = ID]
于 2013-06-08T07:59:40.710 に答える