【问题标题】:how to create a column including the maximum value of another column in R? [duplicate]如何创建一个包含R中另一列最大值的列? [复制]
【发布时间】:2012-09-04 22:25:27
【问题描述】:

使用 R,我想创建一个新列 (MaxAct),显示不同列 (ActNo) 的最大数量,同时按两个因素(HHID 和 PERID)分组

例如,我有这个数据集:

UID HHID PERID ActNo
1   1000 1     1
2   1000 1     2
3   1000 1     3
4   1000 2     1
5   1000 2     2
6   2000 1     1
7   2000 1     2
8   2000 1     3
9   2000 1     4
10  2000 2     1
11  2000 2     2

然后我想添加新列(MaxAct)如下:

UID HHID PERID ActNo MaxAct
1   1000 1     1     3
2   1000 1     2     3
3   1000 1     3     3
4   1000 2     1     2
5   1000 2     2     2
6   2000 1     1     4
7   2000 1     2     4
8   2000 1     3     4
9   2000 1     4     4
10  2000 2     1     2
11  2000 2     2     2

【问题讨论】:

  • 如果您将工作示例连同您的问题一起发布,我们会更容易为您提供帮助。此外,命令dput() 将适当地帮助您制作工作示例。
  • 如果这个问题仍未解决,您真的确实需要使用 dput() 来提供包含问题所有方面的说明。仅发布可能是控制台输出的内容通常无法代表数据对象的内部结构。

标签: r data.table plyr


【解决方案1】:

这是plyrmutatetransform 的标准票价,基数R avedata.table(在这里可能被视为花生的大锤)。

plyrave 方法已得到解决

数据表

library(data.table)
DT <- data.table(DF)
DT[,MaxAct := max(ActNo), by = list(HHID, PERID)]

考虑到数据的大小,data.table 的内存效率和快速特性可能不是必需的。

阅读了您之前的问题How to Create a Column of Ranks While Grouping in R,所以我们知道max(ActNo) 只是每个组中的行数

DT[,MaxAct := .N, by = list(HHID, PERID)]

会起作用,而且会稍微快一点。

【讨论】:

  • ave 方法是第一个,但它非常快速和优雅,您可能错过了它。
  • Yarp,我已经编辑了我的回复。 Ave 很优雅,我开始认为 data.table 很优雅。也许我应该多出去走走。
【解决方案2】:
dat$MaxAct <- with(dat, ave(ActNo, HHID, PERID, FUN=max) )

对于涉及单个向量和分组的问题,您希望结果的长度等于行数,ave 是您的首选函数。对于更复杂的问题,可能需要lapply(split(dat, fac), FUN)的方法或使用do.call(rbind, by( ...))

如果您有缺失值:

dat$MaxAct <- with(dat, ave(ActNo, HHID, PERID, FUN=function(x) max(x, na.rm=TRUE) )  )

【讨论】:

  • 非常感谢你,DWin...但是我有一个错误信息,比如“没有非缺失参数到 max”你有什么建议吗?
  • 它对我有用,但如果您的数据有缺失值(您的插图没有建议),则需要添加 na.rm=TRUE 作为max 的进一步参数。跨度>
  • @DWin,由于存在 NA 值,因此不会引发错误“max no non-missing arguments to max”。但是因为他将 max 应用于 NULL 或 0 长度参数:r.789695.n4.nabble.com/…
【解决方案3】:

R 中有几种方法可以完成这项任务。对我来说,最简单的方法是使用 plyr

require(plyr)
ddply(dat, .(HHID, PERID), transform, MaxAct = max(ActNo))

   UID HHID PERID ActNo MaxAct
1    1 1000     1     1      3
2    2 1000     1     2      3
3    3 1000     1     3      3
4    4 1000     2     1      2
5    5 1000     2     2      2
6    6 2000     1     1      4
7    7 2000     1     2      4
8    8 2000     1     3      4
9    9 2000     1     4      4
10  10 2000     2     1      2
11  11 2000     2     2      2

【讨论】:

    【解决方案4】:
    df <- read.table(textConnection("UID HHID PERID ActNo
    1   1000 1     1
    2   1000 1     2
    3   1000 1     3
    4   1000 2     1
    5   1000 2     2
    6   2000 1     1
    7   2000 1     2
    8   2000 1     3
    9   2000 1     4
    10  2000 2     1
    11  2000 2     2"), header=T)
    
    
    > ddply(df, .(HHID, PERID), transform, MaxAct = length(unique(ActNo)) )
       UID HHID PERID ActNo MaxAct
    1    1 1000     1     1      3
    2    2 1000     1     2      3
    3    3 1000     1     3      3
    4    4 1000     2     1      2
    5    5 1000     2     2      2
    6    6 2000     1     1      4
    7    7 2000     1     2      4
    8    8 2000     1     3      4
    9    9 2000     1     4      4
    10  10 2000     2     1      2
    11  11 2000     2     2      2
    

    【讨论】:

    • 你的问题说最大,但你的示例答案显示了唯一的长度,所以我同意了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-07
    • 2020-11-17
    • 1970-01-01
    • 1970-01-01
    • 2016-10-02
    相关资源
    最近更新 更多