有了下面这样的数据,我正在尝试重新分配任何测试协议(test_A等)。到其相应的时间间隔(time_A等)如果测试为真,则找到所有真实测试时间中的最小值。
[ID] [time_A] [time_B] [time_C] [test_A] [test_B] [test_C] [min_true_time]
[1,] 1 2 3 4 FALSE TRUE FALSE ?
[2,] 2 -4 5 6 TRUE TRUE FALSE ?
[3,] 3 6 1 -2 TRUE TRUE TRUE ?
[4,] 4 -2 3 4 TRUE FALSE FALSE ?我的实际数据集非常大,所以我在if和for循环中的尝试都失败了。但是我不能在应用函数上取得任何进展。
更负的时间,比方说-2将被认为是第3行的最小时间。
欢迎提出任何建议。
发布于 2013-03-09 23:09:59
您没有提供太多信息,但我认为这可以满足您的需求。不知道它是否足够有效,因为你没有说你的数据集实际上有多大。
#I assume your data is in a data.frame:
df <- read.table(text="ID time_A time_B time_C test_A test_B test_C
1 1 2 3 4 FALSE TRUE FALSE
2 2 -4 5 6 TRUE TRUE FALSE
3 3 6 1 -2 TRUE TRUE TRUE
4 4 -2 3 4 TRUE FALSE FALSE")
#loop over all rows and subset column 2:4 with column 5:7, then take the mins
df$min_true_time <- sapply(1:nrow(df), function(i) min(df[i,2:4][unlist(df[i,5:7])]))
df
# ID time_A time_B time_C test_A test_B test_C min_true_time
#1 1 2 3 4 FALSE TRUE FALSE 3
#2 2 -4 5 6 TRUE TRUE FALSE -4
#3 3 6 1 -2 TRUE TRUE TRUE -2
#4 4 -2 3 4 TRUE FALSE FALSE -2另一种方式,可能更快(我没有心情进行基准测试):
m <- as.matrix(df[,2:4])
m[!df[,5:7]] <- NA
df$min_true_time <- apply(m,1,min,na.rm=TRUE)https://stackoverflow.com/questions/15311917
复制相似问题