【问题标题】:r: find lowest value matching criteria over columnsr:查找列的最低值匹配条件
【发布时间】:2017-08-15 09:54:17
【问题描述】:

我的数据框是这样的

personID t1 t2 t3
1         0 11 0
1         0 11 0
2         0 11 13
2         0 11 13
3         0 0  0
3         0 0  0

我需要确保每个人都有一个超过 10 的测试分数。如果他们没有,则必须将他们从数据框中删除。我还想跟踪 10 以上的最低分数,并将其添加到新列中。

因此,结果将如下所示:

personID     t1 t2 t3 new
   1         0 11 0   11
   1         0 11 0   11
   2         0 11 13  11
   2         0 11 13  11

【问题讨论】:

  • ?do.call?pmin

标签: r


【解决方案1】:

如果我要走data.table 路线,我想你可以通过融化并加入:

library(data.table)
setDT(dat)
dat[
  melt(dat, id.vars="personID")[value > 10, .(new=min(value)), by=personID],
  on="personID"
]

#   personID t1 t2 t3 new
#1:        1  0 11  0  11
#2:        1  0 11  0  11
#3:        2  0 11 13  11
#4:        2  0 11 13  11

【讨论】:

  • 我对 data.table 了解不多,但是当我这样做时,我认为我遇到了问题,因为在我的实际数据框中,我有这些测试分数以外的值,它们将进入新列...我可以指定哪些列吗?像 dat[2, 5, 8] 某处?
  • @rdk - 例如,您可以使用melt(dat, id.vars="personID", measure.vars=c("t1","t2","t3"))
  • 我还有包含测试日期的列。我将如何创建一个新列,其中包含我添加到新列中的测试的相应日期?
【解决方案2】:

使用data.table

library(data.table)
#convert your data (named DF here) to use data.table syntax
setDT(DF)

DF[ , {
  # vector of row-wise minima within ID
  m = do.call(pmin, .SD)
  # confirm acceptance condition
  if (min(m) > 10)
    # add new column by appending it to current data
    c(.SD, list(new = m))
}, by = personID]

【讨论】:

  • 我对 data.table 不太熟悉,当我将其设置为变量或尝试查找其类似乎不存在...您知道问题所在吗?有没有办法将其设置回数据框?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-18
  • 1970-01-01
  • 2022-11-24
  • 2020-02-25
  • 1970-01-01
相关资源
最近更新 更多