Добавление двух столбцов в таблицу и сохранение суммы в третьем столбце делает третий столбец кадром данных - PullRequest
0 голосов
/ 04 октября 2019

Я работаю над созданием отчета, при попытке написать тиббл, используя write.xlsx пакета xlsx, он выдал ошибку (даже после того, как я указал as.data.frame (tibble) в write.xlsx). После проверки тиббла я понял, что когда я добавил несколько столбцов и сохранил результат в другом столбце в таблице, итоговый столбец стал фреймом данных.

Пример:

> marks <- tibble(math = c(90,90,85,90),
+                 physics = c(90,85,95,80),
+                 Total = c(rep(NA,4)))
> marks
# A tibble: 4 x 3
   math physics Total
  <dbl>   <dbl> <lgl>
1    90      90 NA   
2    90      85 NA   
3    85      95 NA   
4    90      80 NA   
> class(marks)
[1] "tbl_df"     "tbl"        "data.frame"
> str(marks)
Classes ‘tbl_df’, ‘tbl’ and 'data.frame':   4 obs. of  3 variables:
 $ math   : num  90 90 85 90
 $ physics: num  90 85 95 80
 $ Total  : logi  NA NA NA NA
> marks$Total <- marks[,1] + marks[,2]
> str(marks)
Classes ‘tbl_df’, ‘tbl’ and 'data.frame':   4 obs. of  3 variables:
 $ math   : num  90 90 85 90
 $ physics: num  90 85 95 80
 $ Total  :'data.frame':    4 obs. of  1 variable:
  ..$ math: num  180 175 180 170
> 

Какмы можем видеть выше, я думал, что могу использовать векторизованные операции R, но столбец «Итого» изменился на фрейм данных после суммирования двух столбцов и сохранения результата в столбце итогов.

Может кто-нибудь сообщить мне, почему этотакже происходит, как выполнить вышеуказанную операцию.

Отредактировано: ОК, похоже, потому что tibble не сбрасывает размерность, это не было похоже на добавление двух векторов.

1 Ответ

0 голосов
/ 04 октября 2019

Я думаю, что это результат того факта, что по умолчанию таблицы не отбрасывают 2-е измерение, когда вы обращаетесь к их части с помощью [], в то время как кадры данных делают. Сравните:

> marks[, 1]
# A tibble: 4 x 1
   math
  <dbl>
1    90
2    90
3    85
4    90
> marks_df = as.data.frame(marks)
> marks_df[ , 1]
[1] 90 90 85 90

Итак, marks[, 1] + marks[, 2] добавляет тиббл к тибле, и в результате получается тиббл.

Чтобы избежать этого, вы можете либо явно отбросить 2-е измерение, либо простоиспользуйте имена столбцов:

marks$Total <- marks[,1, drop = TRUE] + marks[, 2, drop = TRUE]
marks$Total <- marks$math + marks$physics
...