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:
我必须创建D列,使用Order_nr和C为每个ID单独设置。
我做过这样的事情df$D = df$C[Order_nr == 1]
ID 1只出现一次因此没有太多可供选择,但ID 7出现6次,我需要在df$C[Order_nr == 1] => 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))
答案 0 :(得分:3)
在使用ddply
为每行mutate
分配值时,我就是这样做的。我将新列命名为D2
,以便将其与您的列D
进行比较。
ddply(df, .(ID), mutate, D2 = C[Order_nr == 1])
我认为你遇到的一些麻烦与你的职能foo
有关。该函数希望您为其提供data.frame,但在ddply
与mutate
一起使用时,您将使用data.frame中的列。我仍在寻找使用原始函数的ddply
选项,但我不确定它是否会成功。
修改强>
要跟进您的功能foo
,您遇到的第一个问题是它没有返回任何内容。我总是要在一个简单的例子上检查我的函数,以确保它们正在做我想让他们做的事情。通知
foo(df[df$ID == 7,])
没有回复,这是一个错误的红旗。
我最终将你的功能改为
foo = function(df) {
C = as.character(df$C[df$Order_nr == 1])
C
}
您可以将ddply
与mutate
一起使用,这需要一个整个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进行了排序,并且所有
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