我试图在一段时间内转换每人有多次观察的数据集。例如,在此期间,人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; /使用来自其他列的值(从未出现在原始数据集的列中);当二进制变量被插入/替换为连续值时,可以清楚地看到这一点。知道为什么会这样吗?
答案 0 :(得分:1)
我认为tapply
对此案有帮助。
您可以通过
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