R:需要ddply()指导

时间:2013-10-15 15:01:29

标签: r plyr

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

为了更好的Pic:

enter image description here

我必须创建D列,使用Order_nr和C为每个ID单独设置。 我做过这样的事情df$D = df$C[Order_nr == 1] ID 1只出现一次因此没有太多可供选择,但ID 7出现6次,我需要在df$C[Order_nr == 1] => N87.1

之后的所有6行中添加N87.1

我试图以多种方式做到这一点并且失败了。到目前为止,我已经设法使用double 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,...的子集...

修改 通过应用head()函数

,度量代码实现了神奇
ddply(df1,.(ID),transform,E=head(C,1))

3 个答案:

答案 0 :(得分:3)

在使用ddply为每行mutate分配值时,我就是这样做的。我将新列命名为D2,以便将其与您的列D进行比较。

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

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

修改

要跟进您的功能foo,您遇到的第一个问题是它没有返回任何内容。我总是要在一个简单的例子上检查我的函数,以确保它们正在做我想让他们做的事情。通知

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

没有回复,这是一个错误的红旗。

我最终将你的功能改为

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

您可以将ddplymutate一起使用,这需要一个整个data.frame的函数。但是,您必须将此结果与@RichieCotton的merge答案结合起来。我坚持使用上面例子中的列名。

ddply(df, .(ID), foo)

答案 1 :(得分: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")

答案 2 :(得分:2)

假设在应用ddply之前已经对Order_no进行了排序,并且所有

都有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