Как я могу назначить имена строк с `‹-` при использовании канала `%›%`?

Мы можем назначить имена строк фрейма данных, используя оператор <- с 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 

Есть ли способ использовать канал %>% для этого?

Я пробовал df %>% rownames(.) <- .[,1], но не удалось.
Основная проблема заключается в том, что нельзя использовать <- между %>%


person kittygirl    schedule 07.05.2019    source источник
comment
Я думаю, вам нужен column_to_rownames из пакета tibble - tibble.tidyverse.org /reference/rownames.html   -  person thelatemail    schedule 07.05.2019
comment
это простая функция, есть ли способ не использовать дополнительный пакет?   -  person kittygirl    schedule 07.05.2019
comment
%>% полезен, чтобы избежать вложенности. Он преобразует foo(bar(baz(x))) в x %>% foo %>% bar %>% baz. В вашем примере вы начинаете с rownames(df) <- df[,1], который не имеет вложенности. Вы не можете использовать %>% в левой части задания.   -  person Gregor Thomas    schedule 07.05.2019
comment
@kittygirl - если вы используете %>%, я просто предположил, что вы, вероятно, уже используете dplyr + tibble и т. д.   -  person thelatemail    schedule 07.05.2019


Ответы (3)


Хотя оператор <- выглядит как что-то особенное, при использовании вместо rownames() он на самом деле является сокращением для функции `rownames<-`(), которую вы можете просто вызвать прямо в конвейере:

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<-`() и `names<-`().

Символ обратной кавычки (`) определяет что-либо как символ, даже если в противном случае он содержит символы, недопустимые в символе. Заключение его в обратные кавычки сообщает R, что вы запускаете функцию с именем rownames<- и передаете .[,1] в качестве аргумента. Без него R перестанет читать имя функции, когда оно достигнет знака <, и будет искать обычную функцию rownames, а это не то, что нам здесь нужно.

Прочтите этот вопрос для более подробной информации о синтаксисе обратных кавычек: Что делают обратные кавычки в R?

person divibisan    schedule 07.05.2019
comment
какое использование `до и после rownames<-? - person kittygirl; 07.05.2019
comment
Он обрабатывает rownames<- как выражение/функцию. В то время как без ` до и после, R будет читать rownames <-, т.е. присваивать что-то объекту rownames. - person Croote; 07.05.2019
comment
Тогда зачем добавлять () к .[,1]? - person kittygirl; 07.05.2019
comment
Потому что `` rownames<-()`` — это функция, которая принимает аргументы в круглых скобках, как и любая другая функция. - person divibisan; 07.05.2019

Без использования какого-либо дополнительного пакета вы можете добиться того же результата, выполнив

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)
person Ronak Shah    schedule 07.05.2019

person    schedule
comment
Разве вы не могли просто использовать var = "a" и обойти вызов rename? - person camille; 07.05.2019
comment
да, я мог. Я попытался сделать это более ясным. Я отредактирую. - person bbiasi; 07.05.2019