【问题标题】:R: Find max/min of list of columns in data frameR:查找数据框中列列表的最大值/最小值
【发布时间】:2016-08-03 16:44:51
【问题描述】:

假设我有一个列名列表作为向量:

vec=c("C1" , "C2" ,"C3").

我知道这些列名来自数据框 df:

df:

C1 C2 C3 C4 C5
1   2  3  4  5
1   4  3  5  6
3   2  4  1  3

如何在 vec 中找到每列的最大值,查看它们在 df 中的值。例如,类似:

boostedMax(vec, df, na.rm=T)

显然这不起作用,但其想法是 boostedMax 采用列名向量和列所在的数据框,并返回这些列的最大值。在本例中,它将返回向量:

(3,4,4)

提前致谢!

【问题讨论】:

  • 已编辑以提供示例数据框。
  • sapply(df[vec], max, na.rm = T)
  • 在提供示例数据时,最好将其复制/粘贴。您可以通过包含创建数据框的代码或发布dput(df) 来做到这一点。

标签: r


【解决方案1】:
vec=c("C1" , "C2" ,"C3")

C1 C2 C3 C4 C5
1   2  3  4  5
1   4  3  5  6
3   2  4  1  3

df <- read.table(con<-file("clipboard"), header = T)
df

apply(df[,vec],2,max)
C1 C2 C3 
 3  4  4

for(i in vec){
  print(max(df[,i]))
}
[1] 3
[1] 4
[1] 4

sapply(df[,vec],max)
C1 C2 C3 
 3  4  4

如果您认为vec 的某些级别可能不在df 中,您可以使用df[,colnames(df) %in% vec] 而不是df[,vec]

【讨论】:

  • applysapply 更糟糕(Gregor 的评论),因为它可能会破坏排序,例如,如果你有混合的 char 和 num 列。
  • 嗯,反正我错了。我以为apply 会搞砸这件事,但不知何故它不会:DF = data.frame(a = c(2.2, 11, 1), b = c("A", "B", "C")); apply(DF, 2, max)
  • @RajRaina 很高兴听到。如果您认为vec 的某些级别可能不在df 中,您可以使用df[,colnames(df) %in% vec]
【解决方案2】:
df <- data.frame(a = c(1:4, NA), b = 6:10, c = 11:15)
d <- colnames(df)[1:2]
sapply(df[d], max, na.rm = TRUE)

【讨论】:

    【解决方案3】:

    将数据集的子集转换为matrix后,我们可以使用matrixStats中的colMaxs

    library(matrixStats)
    colMaxs(as.matrix(df[vec]))
    #[1] 3 4 4
    

    或者另一个选项是dplyr

    library(dplyr)
    df %>%
        summarise_each_(funs(max), vec)
    #  C1 C2 C3
    #1  3  4  4
    

    【讨论】:

      【解决方案4】:
      dat <- data.frame(a=c(1,2,3),b=c(2,3,4),c=c(3,4,5))
      > dat
        a b c
      1 1 2 3
      2 2 3 4
      3 3 4 5
      
      > sapply(dat, max, na.rm = TRUE)
      a b c 
      3 4 5 
      

      【讨论】:

        猜你喜欢
        • 2015-11-28
        • 2020-01-29
        • 2015-09-29
        • 1970-01-01
        • 1970-01-01
        • 2015-01-16
        • 2017-09-19
        • 2015-10-24
        • 2015-04-22
        相关资源
        最近更新 更多