rownames_to_column не работает после rowwise () должным образом

У меня такой df:

df <- structure(list(a = 1:5, b = 6:10, c = 11:15, d = c("a", "b", 
"c", "d", "e"), e = 1:5), row.names = c(NA, -5L), class = c("tbl_df", 
"tbl", "data.frame"))

      a     b     c d         e
  <int> <int> <int> <chr> <int>
1     1     6    11 a         1
2     2     7    12 b         2
3     3     8    13 c         3
4     4     9    14 d         4
5     5    10    15 e         5

rownames_to_column работает:

df %>% 
  column_to_rownames(var="d") %>% 
  rownames_to_column(var= "d")

# Output
  d a  b  c e
1 a 1  6 11 1
2 b 2  7 12 2
3 c 3  8 13 3
4 d 4  9 14 4
5 e 5 10 15 5

rownames_to_column работает некорректно (возвращает индекс?)

df %>%  
  column_to_rownames(var="d") %>% 
  rowwise() %>% 
  rownames_to_column(var= "d")

# Output:
  d         a     b     c     e
  <chr> <int> <int> <int> <int>
1 1         1     6    11     1
2 2         2     7    12     2
3 3         3     8    13     3
4 4         4     9    14     4
5 5         5    10    15     5

Почему возникает такое поведение?


person TarJae    schedule 01.05.2021    source источник
comment
Зачем нужно делать такое преобразование   -  person akrun    schedule 01.05.2021
comment
Может быть, это смешно, но я попытался решить эту проблему: ‹stackoverflow.com/questions/67347390/›. Я хотел скрыть этот столбец, а затем вернуть его после построчной обработки.   -  person TarJae    schedule 01.05.2021
comment
В этом случае вы все равно можете вернуть data.frame в соответствии с решением, которое я там разместил.   -  person akrun    schedule 01.05.2021


Ответы (2)


df изначально это тибл.

class(df)
[1] "tbl_df"     "tbl"        "data.frame"

Когда вы используете column_to_rownames, он становится фреймворком, поскольку у тибблов не может быть имен.

df1 <- df %>% column_to_rownames(var="d")
class(df1)
#[1] "data.frame"

Затем, когда вы используете rowwise, данные снова преобразуются в тиббл, и имена строк теперь теряются.

df2 <- df1 %>% rowwise()
class(df2)
#[1] "rowwise_df" "tbl_df"     "tbl"        "data.frame"

Итак, когда вы выполняете df2 %>% rownames_to_column(var = 'd'), имена строк отсутствуют, поэтому вы получаете столбец d с номером строки.

rownames(df2)
#[1] "1" "2" "3" "4" "5"
person Ronak Shah    schedule 01.05.2021

Мы могли бы создать условие для проверки перед применением rownames_to_column.

library(dplyr)
library(tibble)
df %>%
    column_to_rownames(var = 'd')  %>%
    rowwise %>%
   {if(has_rownames(.)) rownames_to_column(., var = 'd') 
    else .}
person akrun    schedule 01.05.2021
comment
Итак, разве ungroup не отменяет rowwise ?? - person AnilGoyal; 01.05.2021
comment
Спасибо, акрун. Я уже проголосовал за ваш первый ответ здесь - person TarJae; 01.05.2021
comment
@TarJae Я опубликовал решение в другом вашем вопросе - person akrun; 01.05.2021