【问题标题】:r - How to create multiple new columns when conditions met in original columnsr - 当原始列中的条件满足时如何创建多个新列
【发布时间】:2018-08-08 18:04:26
【问题描述】:

我对 r 很新鲜(比如 2 天)。我有一组数据,它是在几个小时内每 200 毫秒采集一次的时间序列。这里是

head(dat):

Date    Time    MSec Sample Pat1  Pat2  Pat3    
1 8/7/~ 14:34   411      0    100   13    13    
2 8/7/~ 14:34   615      1    13    13    143    
3 8/7/~ 14:34   814      2    13    13    13    
4 8/7/~ 14:34    12      3    130   13    13    
5 8/7/~ 14:34   216      4    13    13    130    
6 8/7/~ 14:34   417      5    139   13    13    

它下降了 2 个小时,所以几百个病人的几千点甚至更多。 13 是我们的基线,我们对超过 100 的活动峰值感兴趣。每当信号超过 100 时,我一直在尝试为每个患者列创建一个新列。我制定了以下代码:

dat$Pat1exc <- as.numeric(dat$Pat1 >=100)

这有效并为我提供了新列,我的数据如下所示:

Date    Time    MSec Sample Pat1  Pat2  Pat3  Pat1exc   
1 8/7/~ 14:34   411      0    100   13    13    1
2 8/7/~ 14:34   615      1    13    13    143   0 
3 8/7/~ 14:34   814      2    13    13    13    0
4 8/7/~ 14:34    12      3    130   13    13    1
5 8/7/~ 14:34   216      4    13    13    130   0 
6 8/7/~ 14:34   417      5    139   13    13    1

这正是我想要的,但我不知道如何遍历每一列来创建 Pat2exc、Pat3exc 等。我想我可以在创建函数后使用 sapply 或 vapply。但是,我无法使该功能正常工作。

excite <- function(x, y) {y <- as.numeric(x >=100)}
excite(x=dat$Pat2, y=dat$Pat2exc)

这不会给我任何错误,但不会修改 dat 数据框。本质上,最后我只想总结所有兴奋的列(> = 100)。如果有一种更简单的方法可以为每位患者计算超过 100 个样本,那么我也很乐意学习如何做到这一点。

抱歉,如果不清楚。提前致谢。

P.S.:我也在寻找一种结合 Time 和 Msec 列的好方法。

编辑:在未缩写的数据中添加:

 Date       Time        Msecs
 8/7/2018   14:34:07    411
 8/7/2018   14:34:07    615
 8/7/2018   14:34:07    814
 8/7/2018   14:34:08    12
 8/7/2018   14:34:08    216
 8/7/2018   14:34:08    417
 8/7/2018   14:34:08    619
 8/7/2018   14:34:08    816
 8/7/2018   14:34:09    15

【问题讨论】:

  • 您希望如何组合TimeMsecMsec 代表什么?
  • 哦,对不起,是毫秒。 Time 列已缩写,但应为 14:34:02 或 %H%:%M%:%S%。理想情况下,这两者可以组合成14:34:02.411,,但仍然可以作为时间而不是字符串来读取。
  • 如果是这样,您会提供Time 的非缩写版本吗?或者只要和Msec结合,你就不在乎秒数? (即我可以将 00 秒附加到 Time
  • 好的,我将非缩写数据放入我的编辑中。基本上,我的数据为我提供了日期、时间以及小时、分钟和秒,在另一列中,我得到每个点的毫秒数。我一直只使用Time 来分析这个,但我认为R 也可以理解毫秒。

标签: r function dataframe


【解决方案1】:

我们可以使用dplyr 中的mutate_at 创建二进制变量,然后使用mutate + rowSums 将它们全部加起来:

library(dplyr)
df %>%
  mutate_at(vars(starts_with("Pat")), funs(exc = (. >= 100)*1)) %>%
  mutate(exc_total = rowSums(.[grepl('_exc', names(.))]))

结果:

   Date  Time MSec Sample Pat1 Pat2 Pat3 Pat1_exc Pat2_exc Pat3_exc exc_total
1 8/7/~ 14:34  411      0  100   13   13        1        0        0         1
2 8/7/~ 14:34  615      1   13   13  143        0        0        1         1
3 8/7/~ 14:34  814      2   13   13   13        0        0        0         0
4 8/7/~ 14:34   12      3  130   13   13        1        0        0         1
5 8/7/~ 14:34  216      4   13   13  130        0        0        1         1
6 8/7/~ 14:34  417      5  139   13   13        1        0        0         1

【讨论】:

  • 感谢您的回复。它工作得非常好,我唯一要做的就是总结列。我不清楚我是否想合计 每一列 而不是每一行的二进制值。反正我在图表中不需要它!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-18
  • 1970-01-01
  • 1970-01-01
  • 2021-04-20
  • 2011-11-16
相关资源
最近更新 更多