将摘要数据列表绑定到 data.frame 在 R 中创建一个未知列

Binding a list of summary data to a data.frame creates an unknown column in R

我有一个很大的 df(+100k 行,见下面的数据快照),我试图总结(最小值、平均值、中值、最大值等)[=32 中的变量(盐度) =] 按组(物种)使用 tapply,但是如果我使用整个数据集(包含一些 NA,但不是在每个组中)而不是随机子集,tapply 在 table 中添加一个额外的列创建名为“NA.s”,它对每个组都有一个值。我不确定此列是什么或它是如何创建的。使用 df 中随机选择的行的子集不会重现此问题,因此我不确定如何在此处重现我的数据...

我加载我的数据:

然后我运行这个代码:

sum_stats <- tapply(df$salinity, df$species, summary)

这似乎创建了一个双精度列表(无 NULL),如下所示:

点击其中之一会产生这个,一切都很好:

> sum_stats[["Albula vulpes"]]
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  15.49   15.49   15.49   15.49   15.49   15.49 

然后创建数据框会以某种方式产生问题?

sum_data_table<-data.frame(do.call("rbind", sum_stats))

# Not sure what this is either

Warning message:
In rbind(`Achirus lineatus` = c(Min. = 6.11, `1st Qu.` = 20.97,  :
  number of columns of result is not a multiple of vector length (arg 1)

红色圈出的新未知列:

这将会发生,因为某些物种不会 NAs 而其他物种会。如果缺少 none 并且 rbind 不知道如何处理不同数量的列,summary 将不会有 NA 列。当缺少 none 时,您会看到第一个元素重复(最小值)。对于缺少一些的物种,您会看到 NA

的计数
set.seed(1)
x <- expand.grid(letters, letters, letters)
x <- paste0(x$Var1, x$Var2, x$Var3)[1:150]
df <- data.frame(
  species = rep(x, 100),
  salinity = rnorm(15000)
)
df$salinity[df$salinity < -2.2] <- NA 

sum_stats <- tapply(df$salinity, df$species, summary)

sum_data_table<-data.frame(do.call("rbind", sum_stats))
#> Warning in rbind(aaa = structure(c(Min. = -1.7072100148514, `1st Qu.` =
#> -0.755344253350053, : number of columns of result is not a multiple of vector
#> length (arg 4)

删除丢失的将起作用:

sum_stats <- with(df[!is.na(df$salinity) ,] , tapply(salinity, species, summary))

sum_data_table<-data.frame(do.call("rbind", sum_stats))

或者,如果您还想要缺失信息的摘要,您可以尝试使用 dplyr 中的 bind_rows

library(dplyr)
sum_data_table<-data.frame(do.call(dplyr::bind_rows, sum_stats))