R - 在数据帧的特定子集上获取列最大值

标签 r

我有大量带有各种索引等的数据。我想更改我的数据,如下所示:

id  time  var1_t1  var1_t2  var1_t3  var2_t1  var2_t2  var2_t3 
 1     1      1.5       NA       NA      3.3       NA       NA
 1     2       NA      2.5       NA       NA      1.2       NA
 1     3       NA       NA      3.5       NA       NA       .7

像这样:

id  time  var1_t1  var1_t2  var1_t3  var2_t1  var2_t2  var2_t3 
 1     1      1.5      2.5      3.5      3.3      1.2       .7
 1     2       NA      2.5       NA       NA      1.2       NA
 1     3       NA       NA      3.5       NA       NA       .7

或者这个:

id  time  var1_t1  var1_t2  var1_t3  var2_t1  var2_t2  var2_t3 
 1     1      1.5      2.5      3.5      3.3      1.2       .7
 1     2      1.5      2.5      3.5      3.3      1.2       .7
 1     3      1.5      2.5      3.5      3.3      1.2       .7

除了我需要执行此操作的列超过六列,并且“id”的值不是 1。

我可以对单个列执行此操作,如下所示:

for (i in 1:max(df$id) ){
  df[df$id == i & df$time == 1,]$var1_t1 <- max(df[df$id == i,]$var1_t1, 
                                               na.rm = TRUE)
}

但是它使用了 for 循环,所以这是一个糟糕的主意。我必须为每一列重复该行。有没有办法可以更优雅地做到这一点?

最佳答案

如果您想按 id 组将所有 NA 替换为按列的最大值,您可以定义一些自定义函数:

f <- function(x) {
  x[is.na(x)] <- max(x, na.rm = TRUE)
  x
}

然后使用您最喜欢的数据操作函数/包,例如 dplyr:

library(dplyr)
df %>% group_by(id) %>% mutate_each(funs(f))

或者数据表:

library(data.table)
setDT(df)[, lapply(.SD, f), by = id]

关于R - 在数据帧的特定子集上获取列最大值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29768466/

相关文章:

r - 两个或多个数据帧的平均单元格

r - 对 ggplot2 标题中文本的不同部分使用不同的字体大小

r - 在 R 中,如何用列均值替换缺失值?

r - 有没有办法从表函数中获取不同的计数

r - rmarkdown block 的工作目录不是 markdown 所在的位置

r - 在嵌套数据框中使用 `map()`

r - 仅当为空白或 "."时才需要修剪最后一个字符串

oop - 如何定义 S4 类的子集运算符?

r - 如何取消列出 R 嵌套列表中的任意级别?

R 子集函数,包括 '[' 不适用于大型数据帧/矩阵的中间范围