【问题标题】:r- max values of a rowr- 一行的最大值
【发布时间】:2014-11-27 18:00:32
【问题描述】:

我需要从一行中找到最大值,不包括第一列(这是一个字符)。

我有一个表 MDist

> MDist
          c.1. V2 V3 V4 V5 V6 V7    V8
1 repeticiones  0  0  1  1  1  2  <NA>
2         dias  0  0 12 15 20 28 sumas
3            0 NA NA NA NA NA NA     0
4            0 NA NA NA NA NA NA     0
5           12 NA NA  0  3  8 30    41
6           15 NA NA  3  0  5 26    34
7           20 NA NA  8  5  0 16    29
8           28 NA NA 15 13  8  0    36

我只保留最后一列并转置它:

> b<-data.frame(t(MDist[2:nrow(MDist), ncol(MDist)]))
> b
     X1 X2 X3 X4 X5 X6 X7
1 sumas  0  0 41 34 29 36


sapply(b,class)

      X1       X2       X3       X4       X5       X6       X7 
"factor" "factor" "factor" "factor" "factor" "factor" "factor" 

当我尝试将其转换为数字时,我得到一个全为 1 的向量。

> c<-as.numeric(b[1,2:ncol(b)])
> c

[1] 1 1 1 1 1 1

还有 as.numeric(as.character)) 我遇到了同样的问题:

> as.numeric(as.character(b[1,2:ncol(b)]))
[1] 1 1 1 1 1 1

我需要将原始表 (b) 的每个值除以该行的最大值得到一行。那将是:

0 0 1 34/41 29/41 36/41

【问题讨论】:

  • 改用as.numeric(as.character(b[1,2:ncol(b)]))
  • 让我们回到您读取数据的方式。如果这些列是 factor 并且您希望它们是 numeric,则有问题。你是如何将数据读入 R 的?如果将因子转换为数字然后取最大值,不要期望结果是正确的。
  • 你得到所有factors,因为你转置了数据集,它给出了一个matrix,如果你有一个character列,所有其他列都将更改为character。当您将其转换为 data.frame 而不使用 stringsAsFactors=FALSE 时,这些列将转换为 factor
  • @Gaby P 是的,这就是我提到的关于转换为矩阵的内容。 Matrix 只能容纳一个类。当您的所有列都是数字时,它最有效。否则,只有一个字符列,所有其他列都将转换为字符。因此,转换为 data.frame,不会自动将字符重新转换为数字。我什至不明白使用t 的原因。为什么不能在保持原始结构的同时进行此计算?请查看我更新的帖子,其中对原始数据集进行了类似的计算。
  • @Gaby P 因为MDist 是一个data.frame(我没见过str(MDist)),它可以容纳几个classes。如果你想转置data.frame。识别数字列并进行转置t(MDist[sapply(MDist, is.numeric)]) 话虽如此,我认为transpose 的效率并不高。您可以使用rowSums、rowMeans` 等进行逐行操作,当然还有pmaxpmindata.frame 一起使用

标签: r type-conversion row


【解决方案1】:

我用过 lapply。它有效,但我想更好地理解为什么我不能以其他方式做到这一点。

> as.numeric(lapply(b[1,2:ncol(b)], as.character))
[1]  0  0 41 34 29 36

【讨论】:

    【解决方案2】:

    还有:

    within(MDist, rowMax <- do.call(`pmax`, 
        c(MDist[sapply(MDist, is.numeric)], na.rm=TRUE)))
    #              c.1. V2 V3 V4 V5 V6 V7    V8 rowMax
    #1 repeticiones  0  0  1  1  1  2  <NA>      2
    #2         dias  0  0 12 15 20 28 sumas     28
    #3            0 NA NA NA NA NA NA     0     NA
    #4            0 NA NA NA NA NA NA     0     NA
    #5           12 NA NA  0  3  8 30    41     30
    #6           15 NA NA  3  0  5 26    34     26
    #7           20 NA NA  8  5  0 16    29     16
    #8           28 NA NA 15 13  8  0    36     15
    

    如果您正在寻找将最后一列除以该列的max

    MDist[,ncol(MDist)] <- as.numeric(as.character(MDist[, ncol(MDist)]))
    MDist[,ncol(MDist)]/max(MDist[,ncol(MDist)], na.rm=TRUE)
    # [1]        NA        NA 0.0000000 0.0000000 1.0000000 0.8292683 0.7073171
    #[8] 0.8780488
    

    数据

    MDist <- structure(list(c.1. = structure(c(7L, 6L, 1L, 1L, 2L, 3L, 4L, 
    5L), .Label = c("0", "12", "15", "20", "28", "dias", "repeticiones"
    ), class = "factor"), V2 = c(0L, 0L, NA, NA, NA, NA, NA, NA), 
    V3 = c(0L, 0L, NA, NA, NA, NA, NA, NA), V4 = c(1L, 12L, NA, 
    NA, 0L, 3L, 8L, 15L), V5 = c(1L, 15L, NA, NA, 3L, 0L, 5L, 
    13L), V6 = c(1L, 20L, NA, NA, 8L, 5L, 0L, 8L), V7 = c(2L, 
    28L, NA, NA, 30L, 26L, 16L, 0L), V8 = structure(c(6L, 7L, 
    1L, 1L, 5L, 3L, 2L, 4L), .Label = c("0", "29", "34", "36", 
    "41", "<NA>", "sumas"), class = "factor")), .Names = c("c.1.", 
    "V2", "V3", "V4", "V5", "V6", "V7", "V8"), class = "data.frame", row.names = c("1", 
    "2", "3", "4", "5", "6", "7", "8"))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-02
      • 2020-12-23
      • 2023-03-16
      • 1970-01-01
      • 2020-07-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多