在小标题中添加两列并将总和保存到第三列会使第三列成为数据帧

时间:2019-10-04 05:24:11

标签: r tibble

我正在生成报告,尝试使用xlsx包的write.xlsx编写标题时,它给出了一个错误(即使在我在write.xlsx中指定as.data.frame(tibble)之后)。 在检查了小节之后,我意识到当我添加多列并将结果存储在小节中的另一列中时,总列已成为数据帧。

示例:

> 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的向量化运算,但是在将两列加起来并将结果存储在Total列中之后,“ Total”列已更改为数据帧。

有人可以让我知道为什么会发生这种情况,以及如何执行上述操作。

编辑:确定似乎是因为tibble不会降低尺寸,这不像添加两个向量。

1 个答案:

答案 0 :(得分:0)

我认为这是由于事实的结果,即使用[]访问部分小对象时,默认小对象不会删除第二维,而数据帧却会删除。比较:

> 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]在一个小标题上添加了一个小标题,结果是一个小标题。

为避免这种情况,您可以显式删除第二维,或仅使用列名:

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