0
df=
ID  Order_nr    C             D
1   1     N87.0     N87.0
2   1     N87.1         N87.1
3   1     N87.1         N87.1   
4   1     N87.1     N87.1
4   2     N87.0     N87.1
5   1     D06       D06
6   1     N87.0     N87.0
7   1     N87.1     N87.1
7   2     N87.1     N87.1
7   3     N87.0     N87.1
7   4     N87.0     N87.1
7   5     N87.0     N87.1
7   6     N87.0     N87.1
8   1     N87.0     N87.0

より良い写真のために:

ここに画像の説明を入力

Order_nr と C を使用してすべての ID に対して一意に設定される列 D を作成する必要があります。このようなことを行いましたdf$D = df$C[Order_nr == 1] ID 1 は 1 回しか表示されないため、選択するものはあまりありませんが、ID 7 は 6 回表示され、これらの 6 行すべてに N87.1 を追加する必要があります。 df$C[Order_nr == 1] => N87.1

私は多くの方法でこれをやろうとしましたが、失敗しました。これまでのところ、二重の for ループを使用してそれに近いことを行うことができましたが、それは完璧でも必要でもありませんでした。

私が今設定しているものの例:

foo <- function(df) {
  C = df$C[df$Order_nr == 1] }
ddply( df, .(ID),mutate, foo)

しかし、それは何もしないようです。誰かが私を正しい方向に向けることができますか?

余談ですが。ddply が作成し、後で 1 つの data.frame にまとめるさまざまなサブセットを参照する特定の方法はありますか。10 の異なる ID があり、各 ID が 5 から 10 あるとします。ddply(df,.(ID),...) を使用した場合、ID = 1、2、... のみを持つサブセットを参照するにはどうすればよいですか?

EDIT Metrics コードは、 head() 関数を適用することで魔法を行いました

ddply(df1,.(ID),transform,E=head(C,1))
4

3 に答える 3

3

ddplyを使用して各行に値を割り当てるという点ではmutate、これが私がアプローチした方法です。新しい列に名前を付けて、D2あなたの列と比較できるようにしますD

ddply(df, .(ID), mutate, D2 = C[Order_nr == 1])

あなたが抱えていた問題のいくつかは、あなたの機能に関係していると思いますfoo。その関数は、data.frame を指定することを想定していますが、ddplywithを使用するとmutate、data.frame 内の列を操作することになります。元の機能を使用するオプションをまだ探していddplyますが、うまくいくかどうかはわかりません.

編集

function をフォローアップするためにfoo、最初に発生した問題は、何も返されなかったことです。私は常に簡単な例で自分の関数をチェックして、自分がやりたいことを実行していることを確認する必要があります。知らせ

foo(df[df$ID == 7,])

これは、何かが間違っているという危険信号です。

私はあなたの機能を

foo = function(df) {
  C = as.character(df$C[df$Order_nr == 1])
  C
}

ddplyなしでこれを使用できます。これmutateは、data.frame 全体の関数を期待します。ただし、この結果をmerge@RichieCotton からの回答と組み合わせる必要があります。上記の例のように、列名を使用することに固執します。

ddply(df, .(ID), foo)
于 2013-10-15T15:43:56.963 に答える
2

Order_no は適用前にすでにソートされておりddply、すべての Order_nr が 1 であると仮定します。

library(plyr)
ddply(df1,.(ID),transform,E=head(C,1))
   ID Order_nr     C     D     E
1   1        1 N87.0 N87.0 N87.0
2   2        1 N87.1 N87.1 N87.1
3   3        1 N87.1 N87.1 N87.1
4   4        1 N87.1 N87.1 N87.1
5   4        2 N87.0 N87.1 N87.1
6   5        1   D06   D06   D06
7   6        1 N87.0 N87.0 N87.0
8   7        1 N87.1 N87.1 N87.1
9   7        2 N87.1 N87.1 N87.1
10  7        3 N87.0 N87.1 N87.1
11  7        4 N87.0 N87.1 N87.1
12  7        5 N87.0 N87.1 N87.1
13  7        6 N87.0 N87.1 N87.1
14  8        1 N87.0 N87.0 N87.0
于 2013-10-15T16:07:51.587 に答える
2

必要ありませんddply、必要ですmerge

再現可能なデータセット:

n_groups <- 8
n_reps <- sample(6, n_groups, replace = TRUE)
df <- data.frame(
  ID       = rep(seq_len(n_groups), n_reps),
  Order_nr = unlist(lapply(n_reps, seq_len)),
  C        = sample(letters, sum(n_reps), replace = TRUE)
)

ID とグループのルックアップ テーブルを作成します。

lookup <- subset(df, Order_nr == 1, c(ID, C))
colnames(lookup) <- c("ID", "D")

次に、ID 列をマージします。

merge(df, lookup, by = "ID")
于 2013-10-15T15:27:20.543 に答える