【问题标题】:Replace with maximum value for specific columns by group/ID in R [duplicate]用R中的组/ ID替换特定列的最大值[重复]
【发布时间】: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


【解决方案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

【讨论】:

  • 谢谢,但有没有办法做到这一点而不必为每个变量指定?例如,我有数百列,并且无法为每一列写出一个 tapply 命令。我将如何编写这段代码来执行命令,比如第 5:749 列?
猜你喜欢
  • 2018-06-05
  • 2021-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多