【发布时间】:2017-04-04 20:41:57
【问题描述】:
我正在尝试转换在一段时间内每个人有多个观察值的数据集。例如,在此期间,人 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
如果在指定数量的列(有 700 多个;例如 c(5:749))中出现 1,我需要将每列中的值替换为“1” .理想情况下,输出如下所示:
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
首先我将所有的 NA 更改为 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]
就使用“lapply”的链接分页而言,在给定个人的所有值均为 NA(或 0)的情况下,它似乎不起作用。在这种情况下,它似乎用来自其他列的值“填充”/估算(这些值从未出现在原始数据集中的列中);当二进制变量被插补/替换为连续值时,这一点很明显。知道为什么会发生这种情况吗?
【问题讨论】:
-
在链接的问题中,您可以在 cmets 中看到更多选项。
-
感谢您链接此页面;这似乎是我正在寻找的东西,但我仍然遇到错误。例如,在给定个人的所有值都是 NA 的列中,它似乎用从其他列开始的值“填充”/估算(这些值从未出现在原始数据集中的列中);当二进制变量被插补/替换为连续值时,这一点很明显。知道为什么会发生这种情况吗?
-
好的,也许你可以发布一个例子来说明这一点?我不太明白所描述的情况。
-
谢谢,弗兰克。看起来我的数据表中存在问题 - 重新运行所有内容后,链接页面上的代码有效(并且比循环运行快很多)。感谢您的帮助!
标签: r data.table max dplyr apply