R 我应该如何为该组的所有成员写入最大组号?
我有这样一个数据帧:R 我应该如何为该组的所有成员写入最大组号?,r,R,我有这样一个数据帧: Id relationship age 1 1001 1 60 2 1001 2 50 3 1001 3 20 4 1002 1 70 5 1002 2 68 6 1002 3 23 7 1002 3 27 8 1002 3 27 9 1002
Id relationship age
1 1001 1 60
2 1001 2 50
3 1001 3 20
4 1002 1 70
5 1002 2 68
6 1002 3 23
7 1002 3 27
8 1002 3 27
9 1002 3 23
10 1003 1 60
11 1003 2 40
12 1003 3 20
13 1003 3 20
我想在新列中为相同Id的所有成员编写每个Id的大年龄,并将其命名为maxage。
我需要这个结果:
Id relationship age maxage
1 1001 1 60 60
2 1001 2 50 60
3 1001 3 20 60
4 1002 1 70 70
5 1002 2 68 70
6 1002 3 23 70
7 1002 3 27 70
8 1002 3 27 70
9 1002 3 23 70
10 1003 1 60 60
11 1003 2 40 60
12 1003 3 20 60
13 1003 3 20 60
如果您的数据帧是df,那么
result <- aggregate(age~Id, df, max)
df <- merge(df,result,by="Id")
colnames(df)[3:4] <- c("age","max.age")
df
# Id relationship age max.age
# 1 1001 1 60 60
# 2 1001 2 50 60
# 3 1001 3 20 60
# 4 1002 1 70 70
# 5 1002 2 68 70
# 6 1002 3 23 70
# 7 1002 3 27 70
# 8 1002 3 27 70
# 9 1002 3 23 70
# 10 1003 1 60 60
# 11 1003 2 40 60
# 12 1003 3 20 60
# 13 1003 3 20 60
result另一个选项是
> library(plyr)
>
> ddply(ages, .(Id), function(df) {df$max.age = max(df$age); df})
Id relationship age max.age
1 1001 1 60 60
2 1001 2 50 60
3 1001 3 20 60
4 1002 1 70 70
5 1002 2 68 70
6 1002 3 23 70
7 1002 3 27 70
8 1002 3 27 70
9 1002 3 23 70
10 1003 1 60 60
11 1003 2 40 60
12 1003 3 20 60
13 1003 3 20 60
我需要在上面写的dataframe中的一个新列中写入这个max,但是这个命令将它写入一个新的dataframe中。看来不太好,是的。很抱歉查看我的编辑。我认为这个命令是个好主意,但它在我的系统中不能完全工作。我认为这有问题。它不会在新的专栏中写max.age!我该怎么办?请帮帮我。我的处境很糟糕,我几乎没有时间:(这项工作就像一个集合(a~b)它生成新的数据框并在其中写入max.age,但我需要在数据框上方写入max.age。另一个问题是,该命令非常慢,而且我的数据集非常大,我很乐意提供帮助。我不确定问题出在哪里……据我所知,您需要一个新的列,其中包含每个组的最大年龄。我上面的解决方案不需要是的。所以我不知道你还需要什么。你能更新你的原始问题,显示你的真实数据是什么样子吗?你可以只做dput(head(ages)),假设你的数据被称为“ages”。如果这只是一个“maxage”而不是“max.age”的问题作为列名,只需在我的代码中进行更改。当我使用此命令时,R表示:错误:无法分配大小为1.5 Gb的向量。此外:警告消息:1:in[.data.frame
(x,c(m$xi,if(all.x)m$x.one),c(by.x,seq_len(ncx)[-by.x]),达到4076Mb的总分配:请参阅帮助(memory.size)2:in[.data.frame
(x,c(m$xi,if(all.x)m$x.only),c(by.x,seq_len(ncx)[-by.x]):已达到4076Mb的总分配:请参阅帮助(memory.size)3:In[.data.frame
(x,c(m$xi,if(all.x)m$x,if(all.x)m$x.only),c(by.x,seq_len(ncx)[-by.x]):已达到4076Mb的总分配:请参阅帮助(memory.size)代码在小数据上肯定可以正常工作。听起来您的内存不足。如果可能,请尝试启动一个新的R会话,或者听取@jlhoward的建议并使用data.table
,以避免复制并加快速度。
> library(plyr)
>
> ddply(ages, .(Id), function(df) {df$max.age = max(df$age); df})
Id relationship age max.age
1 1001 1 60 60
2 1001 2 50 60
3 1001 3 20 60
4 1002 1 70 70
5 1002 2 68 70
6 1002 3 23 70
7 1002 3 27 70
8 1002 3 27 70
9 1002 3 23 70
10 1003 1 60 60
11 1003 2 40 60
12 1003 3 20 60
13 1003 3 20 60