【问题标题】:how should I write max group number for all member of that group? [duplicate]我应该如何为该组的所有成员编写最大组数? [复制]
【发布时间】:2014-01-22 10:02:33
【问题描述】:

我有一个这样的数据框:

     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

【问题讨论】:

  • 当我使用这个命令时 R 说:错误:无法分配大小为 1.5 Gb 的向量另外:警告消息:1:在[.data.frame(x, c(m$xi, if (all. x) m$x.alone), c(by.x, seq_len(ncx)[-by.x]), : 达到 4076Mb 的总分配: 见帮助(memory.size) 2: 在[.data.frame(x, c(m$xi, if (all.x) m$x.alone), c(by.x, seq_len(ncx)[-by.x]), : 达到 4076Mb 的总分配:见帮助(memory.size ) 3: In [.data.frame(x, c(m$xi, if (all.x) m$x.alone), c(by.x, seq_len(ncx)[-by.x]), : 达到总数分配 4076Mb:见 help(memory.size)
  • 该代码在小数据上绝对可以正常工作。听起来你的内存已经用完了。如果可能,尝试开始一个新的 R 会话,或者接受 @jlhoward 的建议并使用 data.table 来避免复制并加快速度。

标签: r


【解决方案1】:

如果你的数据框是 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

您也可以使用 data.tables 来执行此操作,实际上我会推荐它,因为它更简单、更快。

library(data.table)
dt <- data.table(df)
dt[,max.age:=max(age),by=Id]
# head(dt)
# 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

【讨论】:

  • 我需要把这个最大值写在我上面写的数据帧的一个新列中,但是这个命令把它写在一个新的数据帧中。所以看起来不太好。
  • 是的。对不起。查看我的编辑。
【解决方案2】:

另一种选择是

> 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

【讨论】:

  • 我认为这个命令是个好主意,但它不能在我的系统中完全工作。我认为它有问题。它不会创建一个新列并在其中写入 max.age !我该怎么办?
  • 请帮助我。我的情况很糟糕,我的时间很少:(这项工作就像聚合(a~b)一样,它会创建新的数据帧并在其中写入max.age,但我需要在上面的数据帧中写入max.age。另一个问题是这个命令很慢,我的数据集很大
  • 当然,我很乐意提供帮助。我不确定问题是什么......据我所知,您想要一个新列,每组的最大年龄。我上面的解决方案就是这样做的。所以我不确定你还需要什么。您能否更新您的原始问题以显示您的真实数据是什么样的?你可以只做 dput(head(ages)),假设你的数据被称为“ages”。
  • 如果只是将“maxage”而不是“max.age”作为列名的问题,只需在我的代码中进行更改即可。
猜你喜欢
  • 2012-12-13
  • 2020-10-30
  • 2020-06-27
  • 2021-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-10
  • 2017-07-14
相关资源
最近更新 更多