获取一列中与矩阵(R)中其他列的最大值对应的值?

时间:2014-03-22 15:11:39

标签: r

好的,这是我的第一个堆栈溢出问题..所以请随意批评。 开始: 我有一个矩阵(更具体地说,时间序列),第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值,它会更有用。

任何线索都将非常感谢。谢谢您的时间。

2 个答案:

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