r-在原始列中满足条件时如何创建多个新列

时间:2018-08-08 18:04:26

标签: r function dataframe

我对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时,我都试图为每个Patient列创建一个新列。我已经制定了以下代码:< / p>

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

1 个答案:

答案 0 :(得分:0)

我们可以使用mutate_at中的dplyr创建二进制变量,并使用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