如何创建一个包含R中另一列的最大值的列?

POT*_*NZA 0 r plyr data.table

使用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
Run Code Online (Sandbox Code Playgroud)

然后我想添加新列(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
Run Code Online (Sandbox Code Playgroud)

42-*_*42- 6

dat$MaxAct <- with(dat, ave(ActNo, HHID, PERID, FUN=max) )
Run Code Online (Sandbox Code Playgroud)

对于涉及单个向量和分组的问题,您希望结果的长度等于行数,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) )  )
Run Code Online (Sandbox Code Playgroud)

  • @DWin,由于存在 NA 值,不会抛出错误“没有非缺失的 max 参数”。但是因为他将 max 应用于 NULL 或 0 长度参数:http://r.789695.n4.nabble.com/error-message-re-max-i-but-code-and-output-seen-OK- td891889.html (2认同)

mne*_*nel 6

这是plyrmutate或者transform基地R avedata.table(在这里可能被认为是花生的大锤)的标准票价.

这些plyrave 方法已得到解决

data.table

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

考虑到数据的大小,data.table可能不需要存储器有效且快速的特性 .

已阅读上一个问题如何在R中进行分组时创建等级列,因此我们知道这max(ActNo)只是每个组中的行数

DT[,MaxAct := .N, by = list(HHID, PERID)]
Run Code Online (Sandbox Code Playgroud)

会工作,而且会更快.