【问题标题】:replace row names with defined vector in R用R中定义的向量替换行名
【发布时间】:2022-01-22 21:38:28
【问题描述】:

有没有一种方法可以根据 R 中的预定义向量替换行名,例如:

rownames(GV)

【问题讨论】:

标签: r dataframe substitution rowname


【解决方案1】:

或者case_when() 对你来说会更容易:

library(dplyr)

df <- data.frame(a = c(1, 2, 3))

rownames(df)
#> [1] "1" "2" "3"

rownames(df) <- case_when(rownames(df) == "1" ~ "one",
                          rownames(df) == "2" ~ "two",
                          TRUE ~ rownames(df))

rownames(df)
#> [1] "one" "two" "3"

您为每个条件指定新值,并为所有剩余情况指定值(TRUE ~ rownames(df) 行) - 对于剩余情况,我将在上面保留之前的行名。

【讨论】:

    【解决方案2】:

    我们可以这样做:

    rownames(mtcars)[which(rownames(mtcars) == "Datsun 710")] <- "My Rowname" 
    head(mtcars)
    
    #>                    mpg cyl disp  hp drat    wt  qsec vs am gear carb
    #> Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
    #> Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
    #> My Rowname        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
    #> Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
    #> Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
    #> Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1
    

    如果我们想重命名更多rownames,我们可以使用%in%,但正如@gss 在cmets 中提到的,这有一个警告:无论%in% 之后的字符向量中名称的顺序如何名称将按照它们在rownames() 中出现的顺序被替换。比较以下两个调用:

    rownames(mtcars)[which(rownames(mtcars) %in% c("Datsun 710", "Mazda RX4 Wag"))] <- c("My Rowname1","My Rowname2")
    head(mtcars)
    #>                    mpg cyl disp  hp drat    wt  qsec vs am gear carb
    #> Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
    #> My Rowname1       21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
    #> My Rowname2       22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
    #> Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
    #> Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
    #> Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1
    

    与以下结果相同:

    rownames(mtcars)[which(rownames(mtcars) %in% c("Mazda RX4 Wag", "Datsun 710"))] <- c("My Rowname1","My Rowname2")
    head(mtcars)
    
    #>                    mpg cyl disp  hp drat    wt  qsec vs am gear carb
    #> Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
    #> My Rowname1       21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
    #> My Rowname2       22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
    #> Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
    #> Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
    #> Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1
    

    reprex package (v2.0.1) 于 2021 年 12 月 21 日创建

    【讨论】:

    • 你确定这个例子是%in%吗?用户可能期望“Datsun 710”将被“My Rowname1”取代,但事实并非如此。我的意思是 - 在你的情况下使用 %in% 意味着用户必须知道对象中名称的顺序是什么才能用他/她选择的名称替换。
    • @gss:好地方,这确实是我在回答中添加的一个警告。使用 {dplyr} 时,您的 case_when 方法更简洁。
    【解决方案3】:

    如果您想重命名所有行,并且您有一个所需的新名称数组按顺序

    example <- head(mtcars, 3)
    mynewnames <- c("First", "Second", "Third")
    rownames(example) <- mynewnames
    example
    #>         mpg cyl disp  hp drat    wt  qsec vs am gear carb
    #> First  21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
    #> Second 21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
    #> Third  22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
    

    如果你想重命名所有行,并且你有一个命名数组(不一定是正确的顺序):

    example <- head(mtcars, 3)
    mynewnames <- c("Datsun 710" = "Datsun", "Mazda RX4" = "Mazda", "Mazda RX4 Wag" = "Also Mazda")
    rownames(example) <- mynewnames[rownames(example)]
    example
    #>             mpg cyl disp  hp drat    wt  qsec vs am gear carb
    #> Mazda      21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
    #> Also Mazda 21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
    #> Datsun     22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
    

    如果你想重命名只有一些行,并有一个命名数组(有序数组在这种情况下没有意义):

    example <- head(mtcars, 3)
    mynewnames <- c("Mazda RX4" = "This Mazda", "Mazda RX4 Wag" = "That Mazda")
    rownames(example)[rownames(example) %in% names(mynewnames)] <-
      mynewnames[rownames(example)[rownames(example) %in% names(mynewnames)]]
    example
    #>             mpg cyl disp  hp drat    wt  qsec vs am gear carb
    #> This Mazda 21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
    #> That Mazda 21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
    #> Datsun 710 22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
    

    这有点笨拙;如果您只替换一个或两个行名,那么@TimTeaFan 的第一个建议可能更容易。

    【讨论】:

      【解决方案4】:

      最安全的方式和 OP 更喜欢使用预定义的命名向量是采用当前行名,替换那些已定义的行名并再次设置行名。这不会在不完整的向量上失败,如果它不能被替换,它会保持原来的状态。

      此解决方案的优点是如果您的重命名向量不完整,可以防止出现以下错误。

      Error in `.rowNamesDF<-`(x, value = value) : 
        missing values in 'row.names' are not allowed
      

      解决方案

      library(stringr) # used for str_replace_all()
      
      df <- data.frame(
        x = rep(1:5),
        y = rep(11:15),
        row.names = LETTERS[1:5]
      )
      
      df
      
      #   x  y
      # A 1 11
      # B 2 12
      # C 3 13
      # D 4 14
      # E 5 15
      
      change <- c("A" = "a", "C" = "c")
      
      row.names(df) <- str_replace_all(row.names(df), change)
      
      df
      
      #   x  y
      # a 1 11
      # B 2 12
      # c 3 13
      # D 4 14
      # E 5 15
      

      【讨论】:

        猜你喜欢
        • 2018-08-17
        • 2014-12-11
        • 2017-07-31
        • 2011-10-04
        • 1970-01-01
        • 2015-04-23
        • 1970-01-01
        • 1970-01-01
        • 2014-11-20
        相关资源
        最近更新 更多