R:如何在一列中找到最大值

时间:2016-01-18 15:00:57

标签: r

我有一个像这样的数据框

  v1    v2  v3
A332    as  1
A333    sm  0.75
A333    lx  0.25
A334    as  0.25
A334    sm  0.25
A334    tp  0.2
A334    dp  0.2
A334    lp  0.1
A335    dp  0.5
A335    tp  0.5

我想为V1选择V3的最大值并获得以下矩阵,如果有超过1个最大值,那么我想保留它们全部。并得到以下矩阵

  v1    v2  v3
A332    as  1
A333    sm  0.75
A334    as  0.25
A334    sm  0.25
A335    dp  0.5
A335    tp  0.5

之后我想以这种方式安排

  v1    v2  v3      v2  v3   v2  v3
A332    as  1               
A333    sm  0.75    as  0.25        
A334    sm  0.25    dp  0.5  tp  0.5

我怎么能用R做,我可以使用任何包? 非常感谢

3 个答案:

答案 0 :(得分:1)

对于问题的第一部分,ave应该有效:

ind <- ave(df$v3, df$v1, FUN = max) == df$v3
df[ind,]

对于第二部分,我只是使用split列出一个列表:

split(df, df$v1)

答案 1 :(得分:0)

问题的第一部分可以通过dplyr实现:

library(dplyr)

df %>%
  group_by(v1) %>%
  filter(v3 == max(v3))

# Source: local data frame [6 x 3]
# Groups: v1 [4]
# 
#       v1     v2    v3
#   (fctr) (fctr) (dbl)
# 1   A332     as  1.00
# 2   A333     sm  0.75
# 3   A334     as  0.25
# 4   A334     sm  0.25
# 5   A335     dp  0.50
# 6   A335     tp  0.50

对于第二部分,我相信这可能是您想要的,可以通过tidyr来实现:

library(tidyr)

df %>%
  group_by(v1) %>%
  filter(v3 == max(v3)) %>%
  mutate(v1_v2 = paste(v1, v2, sep = "-")) %>%
  select(-v1, -v2) %>%
  spread(v1_v2, v3)

# Source: local data frame [4 x 7]
# 
#       v1 A332-as A333-sm A334-as A334-sm A335-dp A335-tp
#  (fctr)   (dbl)   (dbl)   (dbl)   (dbl)   (dbl)   (dbl)
# 1   A332       1      NA      NA      NA      NA      NA
# 2   A333      NA    0.75      NA      NA      NA      NA
# 3   A334      NA      NA    0.25    0.25      NA      NA
# 4   A335      NA      NA      NA      NA     0.5     0.5

答案 2 :(得分:0)

您可以使用aggregatetapply

执行此操作
#recreate dataset
df = data.frame(t(matrix(nrow=3,data=c(
"A332",    "as",  1,
"A333",    "sm",  0.75,
"A333",    "lx",  0.25,
"A334",    "as",  0.25,
"A334",    "sm",  0.25,
"A334",    "tp",  0.2,
"A334",    "dp",  0.2,
"A334",    "lp",  0.1,
"A335",    "dp",  0.5,
"A335",    "tp",  0.5))))
names(df)=c("v1","v2","v3")
df$v3 = as.numeric(as.vector(df$v3))


aggregate(df[,3],by=df[,1:2],max)
     v1 v2    x
1  A332 as 1.00
2  A334 as 0.25
3  A334 dp 0.20
4  A335 dp 0.50
5  A334 lp 0.10
6  A333 lx 0.25
7  A333 sm 0.75
8  A334 sm 0.25
9  A334 tp 0.20
10 A335 tp 0.50

tapply(X=df[, 3], INDEX=list(df$v1, df$v2), FUN=max)
       as  dp  lp   lx   sm  tp
A332 1.00  NA  NA   NA   NA  NA
A333   NA  NA  NA 0.25 0.75  NA
A334 0.25 0.2 0.1   NA 0.25 0.2
A335   NA 0.5  NA   NA   NA 0.5