我有大量带有各种索引等的数据。我想更改我的数据,如下所示:
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/