基于多列的R条件计数器
R Conditional Counter based on multiple columns
我有一个数据框,其中包含来自受试者 (subid) 的多个响应,这些响应位于标记为试验的列中。试验计数,然后在一个受试者内重新开始。
这是一个示例数据框:
subid <- rep(1:2, c(10,10))
trial <- rep(1:5, 4)
response <- rnorm(20, 10, 3)
df <- as.data.frame(cbind(subid,trial, response))
df
subid trial response
1 1 1 3.591832
2 1 2 8.980606
3 1 3 12.943185
4 1 4 9.149388
5 1 5 10.192392
6 1 1 15.998124
7 1 2 13.288248
我想要一个列,每次试验在一个主题 ID (subid) 内重新开始时递增:
df$block <- c(rep(1:2, c(5,5)),rep(1:2, c(5,5)))
df
subid trial response block
1 1 1 3.591832 1
2 1 2 8.980606 1
3 1 3 12.943185 1
4 1 4 9.149388 1
5 1 5 10.192392 1
6 1 1 15.998124 2
7 1 2 13.288248 2
无法预测试验将在何处重新开始。到目前为止,我的解决方案很混乱,并且使用了 for 循环。
解决方案:
block <- 0
blocklist <- 0
for (i in seq_along(df$trial)){
if (df$trial[i]==1){
block = block + 1}else
if (df$trial!=1){
block = block}
blocklist<- c(blocklist, block)
}
blocklist <- blocklist[-1]
df$block <- blocklist
此解决方案不会以新的补贴重新开始。在此之前,我试图在管道中使用 Wickham 的 tidyverse 和 mutate() 和 ifelse()。如果有人知道使用该软件包完成此操作的方法,我将不胜感激。但是,我将使用任何包中的解决方案。我已经搜索了大约一天,不认为这是与 .
等其他问题的重复问题
我们可以通过 base R
中的 ave
来做到这一点
df$block <- with(df, ave(trial, subid, FUN = function(x) cumsum(x==1)))
或 dplyr
library(dplyr)
df %>%
group_by(subid) %>%
mutate(block = cumsum(trial==1))
我有一个数据框,其中包含来自受试者 (subid) 的多个响应,这些响应位于标记为试验的列中。试验计数,然后在一个受试者内重新开始。
这是一个示例数据框:
subid <- rep(1:2, c(10,10))
trial <- rep(1:5, 4)
response <- rnorm(20, 10, 3)
df <- as.data.frame(cbind(subid,trial, response))
df
subid trial response
1 1 1 3.591832
2 1 2 8.980606
3 1 3 12.943185
4 1 4 9.149388
5 1 5 10.192392
6 1 1 15.998124
7 1 2 13.288248
我想要一个列,每次试验在一个主题 ID (subid) 内重新开始时递增:
df$block <- c(rep(1:2, c(5,5)),rep(1:2, c(5,5)))
df
subid trial response block
1 1 1 3.591832 1
2 1 2 8.980606 1
3 1 3 12.943185 1
4 1 4 9.149388 1
5 1 5 10.192392 1
6 1 1 15.998124 2
7 1 2 13.288248 2
无法预测试验将在何处重新开始。到目前为止,我的解决方案很混乱,并且使用了 for 循环。
解决方案:
block <- 0
blocklist <- 0
for (i in seq_along(df$trial)){
if (df$trial[i]==1){
block = block + 1}else
if (df$trial!=1){
block = block}
blocklist<- c(blocklist, block)
}
blocklist <- blocklist[-1]
df$block <- blocklist
此解决方案不会以新的补贴重新开始。在此之前,我试图在管道中使用 Wickham 的 tidyverse 和 mutate() 和 ifelse()。如果有人知道使用该软件包完成此操作的方法,我将不胜感激。但是,我将使用任何包中的解决方案。我已经搜索了大约一天,不认为这是与
我们可以通过 base R
ave
来做到这一点
df$block <- with(df, ave(trial, subid, FUN = function(x) cumsum(x==1)))
或 dplyr
library(dplyr)
df %>%
group_by(subid) %>%
mutate(block = cumsum(trial==1))