我对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
答案 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