【问题标题】:How can I assign rownames with `<-` while using a pipe `%>%`? [duplicate]如何在使用管道 `%>%` 时使用`<-` 分配行名? [复制]
【发布时间】:2019-09-24 15:38:10
【问题描述】:

我们可以使用&lt;- 运算符和rownames(df) 来分配数据框的行名,如下所示:

df<-data.frame(a=letters[1:5], b=1:5, c=LETTERS[1:5])
df
rownames(df) <- df[,1]
df[,1] <- NULL
df

上面的脚本会将第一列转换为行名,输出如下:

df
  a b c
1 a 1 A
2 b 2 B
3 c 3 C
4 d 4 D
5 e 5 E

df
  b c
a 1 A
b 2 B
c 3 C
d 4 D
e 5 E 

有没有办法使用管道%&gt;% 来做到这一点?

我尝试了df %&gt;% rownames(.) &lt;- .[,1],但失败了。
关键问题是不能在%&gt;%之间使用&lt;-

【问题讨论】:

  • 我想你想要 tibble 包中的 column_to_rownames - tibble.tidyverse.org/reference/rownames.html
  • 功能很简单,有没有办法不用额外的包?
  • %&gt;% 对于避免嵌套很有用。它将foo(bar(baz(x))) 转换为x %&gt;% foo %&gt;% bar %&gt;% baz。在您的示例中,您从 rownames(df) &lt;- df[,1] 开始,它没有嵌套。您不能在作业的左侧使用%&gt;%
  • @kittygirl - 如果您使用的是 %&gt;%,我只是假设您可能已经在使用 dplyr + tibble 等。

标签: r magrittr


【解决方案1】:

不使用任何额外的包,你可以通过这样做来达到相同的结果

df1 <- data.frame(df[-1], row.names = df[,1])
df1
#  b c
#a 1 A
#b 2 B
#c 3 C
#d 4 D
#e 5 E

使用dplyr,您可能只需要pull 将列中的值分配给rownames

library(dplyr)
rownames(df) <- df %>% pull(a)

【讨论】:

    【解决方案2】:

    虽然&lt;- 运算符看起来很特别,但当用于替换rownames() 时,它实际上是`rownames&lt;-`() 函数的快捷方式,您可以直接在管道中调用它:

    data.frame(a=letters[1:5], b=1:5, c=LETTERS[1:5]) %>%
        `rownames<-`(.[,1])
    
      a b c
    a a 1 A
    b b 2 B
    c c 3 C
    d d 4 D
    e e 5 E
    

    这是您在分配行名时实际上一直在使用的函数:

    # When you write this
    rownames(df) <- c(1:5)
    
    # What R is actually doing is running this function:
    `rownames<-`(df, c(1:5))
    

    您也可以使用 `colnames&lt;-`()`names&lt;-`() 做同样的事情

    反引号字符 (`) 将某些内容定义为符号,即使它包含符号中的非法字符也是如此。将其括在反引号中告诉 R,您正在运行一个名为 rownames&lt;- 的函数,并将 .[,1] 作为参数传入。没有它,R 会在到达&lt; 符号时停止读取函数名,并寻找正常的rownames 函数,这不是我们想要的。

    阅读此问题以获取有关反引号语法的更多详细信息:What do backticks do in R?

    【讨论】:

    • rownames&lt;-前后的`有什么用?
    • 它将rownames&lt;- 视为表达式/函数。而没有 ` 之前和之后,R 将读取 rownames &lt;- 即分配一些东西给对象 rownames
    • 那么,为什么要在.[,1] 周围加上()
    • 因为 ``rownames&lt;-()`` 是一个在其括号内接受参数的函数,就像任何其他函数一样。
    【解决方案3】:
    df <- data.frame(a = letters[1:5], b = 1:5, c = LETTERS[1:5])
    df
    
    > df
      a b c
    1 a 1 A
    2 b 2 B
    3 c 3 C
    4 d 4 D
    5 e 5 E
    
    library(dplyr)
    library(tibble)
    df1 <- df %>% 
      tibble::column_to_rownames(var = "a")
    df1  
    
    > df1
      b c
    a 1 A
    b 2 B
    c 3 C
    d 4 D
    e 5 E
    

    【讨论】:

    • 您不能刚刚使用var = "a" 并绕过rename 调用吗?
    • 是的,我可以。我试图让它更清楚。我会编辑。
    猜你喜欢
    • 2017-01-08
    • 1970-01-01
    • 1970-01-01
    • 2016-05-25
    • 2021-02-02
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 2018-11-11
    相关资源
    最近更新 更多