按R中的组/ ID替换特定列的最大值

时间:2017-04-04 20:41:57

标签: r data.table max dplyr apply

我试图在一段时间内转换每人有多次观察的数据集。例如,在此期间,人1可以是肥胖而不是肥胖(仅仅是超重)。以下是第1人的一个例子:

ID     Obese     Overweight
1       NA          NA
1       NA          NA
1       0           1
1       1           0
1       0           0
2       NA          0
2       0           1
2       0           NA

我需要将每列中的值替换为" 1"如果在一个列中有一个1出现,则在指定数量的列中(有700多个;例如c(5:749))BY" ID"。理想情况下,输出看起来像:

ID     Obese     Overweight
1       1           1
1       1           1
1       1           1
1       1           1
1       1           1
2       0           1
2       0           1
2       0           1

首先,我将所有NAs更改为0;然后,我想我可以在每列中取最大值并替换(通过ID),但无法找到关于如何按组(" ID")和一组给定列进行此操作的文档(即c(5:749))。此外,我不想创建新列,而只是替换数据框中已存在的列中的值。

我让它为单个变量工作,但无法将其转换为循环以通过一组变量...

dat2 <- dat[, Obese:= max(Obese), by=ID]

另外,我认为在给定数据大小的情况下,循环会花费太长时间。还有其他建议吗?提前致谢。这是一个示例数据集:

dat <- as.data.frame(matrix(NA,18))
dat$id <- as.character(c(1,1,1,1,1,1,2,2,2,2,2,2,3,3,3,3,3,3))
dat$ob1 <- as.character(c(NA,NA,0,1,0,NA,0,1,0,0,0,0,0,0,0,0,0,0))
dat$ob2 <- as.character(c(NA,NA,1,0,0,NA,0,0,1,0,0,0,0,1,0,0,0,0))
dat <- dat[,-1]

对于使用&#34; lapply&#34;进行链接分页,在所有值为给定个体的NA(或0)的情况下,它似乎不起作用。在这种情况下,似乎&#34;填写&#34; /使用来自其他列的值(从未出现在原始数据集的列中);当二进制变量被插入/替换为连续值时,可以清楚地看到这一点。知道为什么会这样吗?

1 个答案:

答案 0 :(得分:1)

我认为tapply对此案有帮助。 您可以通过

找到每个ID的最大值
with(dat, tapply(ob1, id, max))

我的解决方案是:

dat$ob1 <- as.numeric(dat$ob1)
dat$ob2 <- as.numeric(dat$ob2)
dat[is.na(dat)] <- 0

dat$ob1 <-  with(dat,tapply(ob1,id,max)[id])
dat$ob2 <-  with(dat,tapply(ob2,id,max)[id])

dat
   id ob1 ob2
1   1   1   1
2   1   1   1
3   1   1   1
4   1   1   1
5   1   1   1
6   1   1   1
7   2   1   1
8   2   1   1
9   2   1   1
10  2   1   1
11  2   1   1
12  2   1   1
13  3   0   1
14  3   0   1
15  3   0   1
16  3   0   1
17  3   0   1
18  3   0   1