基于R中Dataframe的其他列的最大值提取一列

时间:2018-01-04 07:04:57

标签: r dataframe sapply

我正在尝试在' a'中获取列中的值对应于最大值od列' c',' d'并且' e'然后将其存储在矢量中。 我在下面写了一些代码,它给出了列' a'数据和两个NA。 有人可以帮助我使用sapply获取确切的数据。

a<-c('A','B','C','D','E')
b<-c(10,30,45,25,40)
c<-c(19,23,25,37,39)
d<-c(43,21,17,14,26)
e<-c(NA,23,45,32,NA)
df<-data.frame(a,b,c,d,e)

A1<-vector("character",3)
for (i in 3:5){
  A1[i]<-c(df[which(df[,i]==max(df[,i],na.rm = TRUE)),1])
  A1    
}

实际结果:&gt; A1 [1]&#34;&#34; &#34;&#34; &#34; E&#34; &#34; A&#34; &#34; C&#34;

预期结果:A1应该有&#34; E&#34; &#34; A&#34; &#34; C&#34;

请使用sapply建议解决方案。

由于

1 个答案:

答案 0 :(得分:0)

我们可以使用mapply

unname(mapply(function(x, y) x[which(y == max(y, na.rm = TRUE))], df[1], df[3:5]))
#[1] "E" "A" "C"

在循环中,索引从3:5开始,这是列的索引,而&#39; A1&#39;矢量对象初始化为3个元素。如果赋值从第3个元素开始,vector只会附加新元素,同时保持前2个元素不变。

A1<-vector("character",3)
A1
#[1] "" "" ""

A2 <- A1
A2[3:5] <- 15
A2
#[1] ""   ""   "15" "15" "15"  #### this is the same thing happening in the loop

相反,我们可以遍历序列,然后分配

i1 <- 3:5
for(i in seq_along(i1)) {
   A1[i] <- df[which(df[,i1[i]]==max(df[,i1[i]],na.rm = TRUE)),1]
}

A1
#[1] "E" "A" "C"