在 tibble 中添加两列并将总和保存到第三列是使第三列成为数据框

Adding two columns in a tibble and saving the sum to third column is making the third column a dataframe

我正在生成一份报告,在尝试使用 xlsx 包的 write.xlsx 编写 tibble 时,它​​给出了一个错误(即使在我在 [=22= 中指定 as.data.frame(tibble) 之后]). 查看tibble,我发现当我添加多个列并将结果存储在tibble中的另一列时,总列变成了一个dataframe。

示例:

> 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" 列已更改为数据帧。

谁能告诉我为什么会发生这种情况,以及如何执行上述操作。

已编辑:好的似乎是因为 tibble 不会降低维度,这不像是添加两个向量。

我认为这是因为当您使用 [] 访问其中的一部分时,默认情况下 tibbles 不会丢弃第二维,而数据帧会。比较:

> 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