好的,这是我的第一个堆栈溢出问题..所以请随意批评。 开始: 我有一个矩阵(更具体地说,时间序列),第1列中的时间和后续列(X1,X2,... X10)中的单个观察值如下所示:
df <- data.frame(matrix(sample(1:30,30), ncol=6))
time<-seq(0,9,1)
df.ts<-cbind(time,df)
我想要提取的是“时间”列中与最大值对应的值 在每个X变量? 我可以像这样从每列中提取最大值:
max_vals<-apply(df,2,max)
作为第一步,我尝试使用以下方法获取各个指数:
ind=rep(NA,10)
for( i in 1:length(max_vals)) {
if (df.ts[,i]==max_vals[i])
ind<-df.ts$time[i]
}
这不适用于以下错误:
1: In if (df.ts[, i] == max_vals[i]) ind <- df.ts$time[i] :
the condition has length > 1 and only the first element will be used
2: In if (df.ts[, i] == max_vals[i]) ind <- df.ts$time[i] :
the condition has length > 1 and only the first element will be used
3: In if (df.ts[, i] == max_vals[i]) ind <- df.ts$time[i] :
the condition has length > 1 and only the first element will be used
4: In if (df.ts[, i] == max_vals[i]) ind <- df.ts$time[i] :
the condition has length > 1 and only the first element will be used
5: In if (df.ts[, i] == max_vals[i]) ind <- df.ts$time[i] :
the condition has length > 1 and only the first element will be used
6: In if (df.ts[, i] == max_vals[i]) ind <- df.ts$time[i] :
the condition has length > 1 and only the first element will be used
即使我能够获得索引,如果我能得到与每个其他列中的最大值相对应的df.ts $ time值,它会更有用。
任何线索都将非常感谢。谢谢您的时间。
答案 0 :(得分:2)
您的代码无效,因为if
需要一个布尔值,而布尔语句的左侧长度为&gt;如图1所示,得到长度> 1的布尔矢量。你可以用ifelse
做一些事情,这将花费长度&gt; 1个输入,但在这种情况下which.max
要简单得多。
df <- data.frame(time=seq(0,9,1), matrix(sample(1:30,30), ncol=6))
df$time[apply(df,2,which.max)]
这将只占用最大值的第一次出现,因此如果有多个时间点具有最大值,您可能想要做其他事情。在示例数据中,前五行始终与最后五行相同,因此始终有两次出现。但更一般地说,数字并不总是相同,因此您需要一个列表来存储这些结果,因此您可以lapply
遍历数据框的列并which
找到与最大值对应的所有索引
lapply(df, function(x) df$time[which(x==max(x))])
答案 1 :(得分:1)
使用which
:
max.ind <- lapply(df.ts[,-1], function(x) which(x==max(x)))
lapply(max.ind, function(i, DF) DF[i,1], DF=df.ts)
# $X1
# [1] 4 9
#
# $X2
# [1] 0 5
#
# $X3
# [1] 2 7
#
# $X4
# [1] 0 5
#
# $X5
# [1] 0 5
#
# $X6
# [1] 2 7