R:ddply()需要指导

R:ddply()需要指导,r,plyr,R,Plyr,为了获得更好的图片: 我必须创建D列,这是优衣库使用Order和C为每个ID设置的。 我做过类似的事情df$D=df$C[Order\u nr==1] ID 1只出现一次,因此没有太多选择,但ID 7出现了6次,我需要将N87.1添加到所有这6行中,因为df$C[Order_nr==1]=>N87.1 我尝试过很多方法,但都失败了。到目前为止,我已经成功地使用double for循环实现了一些类似的功能,但这并不完美,也不是必需的 我现在准备的示例: df= ID Order_nr C

为了获得更好的图片:

我必须创建D列,这是优衣库使用Order和C为每个ID设置的。 我做过类似的事情df$D=df$C[Order\u nr==1] ID 1只出现一次,因此没有太多选择,但ID 7出现了6次,我需要将N87.1添加到所有这6行中,因为df$C[Order_nr==1]=>N87.1

我尝试过很多方法,但都失败了。到目前为止,我已经成功地使用double for循环实现了一些类似的功能,但这并不完美,也不是必需的

我现在准备的示例:

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
你不需要ddply,你需要合并

可复制的数据集:

ddply(df1,.(ID),transform,E=head(C,1))
就使用ddply为带有mutate的每一行分配一个值而言,这就是我应该如何处理它的方法。我将新列命名为D2,以便将其与您的D列进行比较

我认为你遇到的一些麻烦与你的函数foo有关。该函数希望您为其提供一个data.frame,但当您将ddply与mutate一起使用时,您将处理data.frame中的列。我仍在寻找使用原始函数的ddply选项,但我不确定它是否可行

编辑

要继续使用函数foo,您遇到的第一个问题是它没有返回任何内容。我总是需要在一个简单的例子中检查我的函数,以确保它们执行我希望它们执行的操作。通知

ddply(df, .(ID), mutate, D2 = C[Order_nr == 1])
不返回答案,这是错误的危险信号

最后我把你的函数改成了

foo(df[df$ID == 7,])
您可以将其与ddply一起使用,而无需进行变异,因为整个data.frame需要一个函数。但是,您必须将此结果与@RichieCotton的合并答案相结合。我坚持使用上面示例中的列名

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

假设在应用ddply之前已对订单号进行排序,并且所有订单号均为订单号1

ddply(df, .(ID), foo)

欢迎来到SO。为了便于其他人复制您的数据,请粘贴来自dputdf的输出,或者提供代码来创建一个玩具示例,就像我在回答中所做的那样。我将在以后的问题中记住这一点。下面是两个很好的答案,但我只是想指出,foo函数不起作用,因为它返回的是向量而不是data.frame。无论传递给ddply的函数是什么,都必须返回data.frame,否则它只会提供您开始使用的内容。aosmith的答案之所以有效,是因为他使用了mutate,它修改了您传递给它的data.frame。感谢您的回复,但有一个小问题。我必须使用plyr库做同样的事情。我确信如果我被允许使用merge,我将能够在没有帮助的情况下完成它,但在这种情况下,我必须使用ddply来完成它,我无法理解它,因为我们没有得到太多关于它的资料,我也无法在web上找到任何有用的东西。我只是没有主意。如果这是家庭作业,一定要引用这里给你的帮助。谢谢。我原以为这是一段很短的代码,但这让我说不出话来。我将永远记住这些头/尾函数。感谢您关注这一点,但似乎Metrics能够使用头函数为我提供所需的结果。@KarlRä是,如果我最初的答案没有提供所需的结果,您应该让我知道,因为它对我有效。编辑只是一个额外的教学时刻,帮助您理解R和ddply。
ddply(df, .(ID), mutate, D2 = C[Order_nr == 1])
foo(df[df$ID == 7,])
foo = function(df) {
  C = as.character(df$C[df$Order_nr == 1])
  C
}
ddply(df, .(ID), foo)
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