Удалить атрибуты из данных, прочитанных в readr :: read_csv

readr::read_csv добавляет атрибуты, которые не обновляются при редактировании данных. Например,

library('tidyverse')
df <- read_csv("A,B,C\na,1,x\nb,1,y\nc,1,z")

# Remove columns with only one distinct entry
no_info <- df %>% sapply(n_distinct)
no_info <- names(no_info[no_info==1]) 

df2 <- df %>% 
  select(-no_info)

Осматривая структуру, мы видим, что столбец B все еще присутствует в атрибутах df2:

> str(df)
Classes ‘spec_tbl_df’, ‘tbl_df’, ‘tbl’ and 'data.frame':    3 obs. of  3 variables:
 $ A: chr  "a" "b" "c"
 $ B: num  1 1 1
 $ C: chr  "x" "y" "z"
 - attr(*, "spec")=
  .. cols(
  ..   A = col_character(),
  ..   B = col_double(),
  ..   C = col_character()
  .. )
> str(df2)
Classes ‘spec_tbl_df’, ‘tbl_df’, ‘tbl’ and 'data.frame':    3 obs. of  2 variables:
 $ A: chr  "a" "b" "c"
 $ C: chr  "x" "y" "z"
 - attr(*, "spec")=
  .. cols(
  ..   A = col_character(),
  ..   B = col_double(),
  ..   C = col_character()
  .. )
> attributes(df2)
$class
[1] "spec_tbl_df" "tbl_df"      "tbl"         "data.frame" 

$row.names
[1] 1 2 3

$spec
cols(
  A = col_character(),
  B = col_double(),
  C = col_character()
)

$names
[1] "A" "C"

> 

Как я могу удалить столбцы (или любые другие обновления данных) и точно отразить изменения в новой структуре данных и атрибутах?


person conor    schedule 02.01.2019    source источник
comment
из любопытства, зачем ты это хочешь? Я понимаю, что вы хотите, чтобы атрибуты указывали на фактическое блюдо, но почему вас это волнует? Ваше здоровье   -  person Khaynes    schedule 02.01.2019
comment
Во-первых, раздражает прокрутка информации по несуществующим столбцам, особенно когда имеется большое количество столбцов и вы удалили их программным способом. Другой - это проблема непредвиденных последствий, например, когда вы не отбрасываете факторы после удаления некоторых из них, и будущие расчеты, графики и т. Д. Будут вести себя иначе, как если бы они все еще были там. Я не уверен в последствиях включения информации о функциях, которые больше не существуют.   -  person conor    schedule 02.01.2019
comment
Я имею в виду, ты мог бы просто сделать data.frame(df2).   -  person joran    schedule 02.01.2019


Ответы (2)


Вы можете удалить спецификацию столбца, установив для него значение NULL:

> attr(df, 'spec') <- NULL
> str(df)
Classes ‘tbl_df’, ‘tbl’ and 'data.frame':   3 obs. of  3 variables:
 $ A: chr  "a" "b" "c"
 $ B: int  1 1 1
 $ C: chr  "x" "y" "z"
> df
# A tibble: 3 x 3
  A         B C    
  <chr> <int> <chr>
1 a         1 x    
2 b         1 y    
3 c         1 z    
person mt1022    schedule 02.01.2019
comment
Это полностью удаляет атрибут, а не просто настраивает его для отражения данных после манипуляции. - person conor; 03.01.2019
comment
@conor Ага. Я немного поискал и не нашел никакой функции, которая его обновляет. Однако спецификации столбцов больше нигде не используются. Он сообщает вам, как read_csv анализировал каждый столбец во время чтения. Насколько я знаю, их бросать безопасно и маловероятно, что это приведет к нежелательным последствиям. - person mt1022; 03.01.2019
comment
Я бы хотел, чтобы он обновил атрибут. У меня такая же проблема с атрибутом problems после импорта беспорядочных данных. Даже после удаления проблемного столбца остается problem тиббл. Раздражающий. - person Nova; 09.07.2019

Для меня это работает (R версия 4.0.5 (2021-03-31)):

> attr(data, "class")
[1] "spec_tbl_df" "tbl_df"      "tbl"         "data.frame" 
> attr(data, "class") <- attr(data, "class")[-1]
> attr(data, "class")
[1] "tbl_df"     "tbl"        "data.frame"
person Benedek Dankó    schedule 10.04.2021