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

为了更好的图片:

在此处输入图像描述

我必须创建列 D,它是使用 Order_nr 和 C 为每个 ID 唯一设置的。我做了类似这样的事情df$D = df$C[Order_nr == 1] ID 1 只出现一次,所以没有太多可供选择,但 ID 7 出现 6 次,我需要将 N87.1 添加到所有这 6 行,因为 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,但是当您使用时ddplymutate您将使用 data.frame 中的列。我仍在寻找ddply使用您原始功能的选项,但我不确定它是否会奏效。

编辑

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

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

不返回答案,这是一个危险信号,表明有问题。

我最终将您的功能更改为

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

您可以将其与ddplywithout一起使用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 回答