【问题标题】:Binding a list of summary data to a data.frame creates an unknown column in R将汇总数据列表绑定到 data.frame 在 R 中创建一个未知列
【发布时间】:2022-01-15 11:26:04
【问题描述】:

我有一个很大的 df(+100k 行,请参阅下面的数据快照),我正在尝试按组(物种)总结(最小值、平均值、中值、最大值等)表中的变量(盐度) ) 使用tapply,但如果我使用整个数据集(包含几个NA,但不是在每个组中)而不是随机子集,tapply 在它创建的表中添加一个名为“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)

红色圈出的新未知列:

【问题讨论】:

  • 如果添加忽略 NA 的参数会发生什么? tapply(df$salinity, df$species, summary, na.rm=TRUE)
  • NA.s 列仍然存在 :(
  • 您能提供一些数据吗?你可以只做dput(head(df)) 来提供几行。
  • 在随机的行数子集上运行代码会导致该列不出现。我使用这个 mini_data
  • > dput(head(df)) structure(list(species = c(“Hippolyte pleuracanthus”、“Hippolyte pleuracanthus”、“Hippolyte pleuracanthus”、“Hippolyte pleuracanthus”、“Hippolyte pleuracanthus”、“ Hippolyte pleuracanthus"), 盐度 = c(37, 37, 37, 37, 37, 37)), row.names = c(NA, 6L), class= "data.frame")

标签: r summarize tapply


【解决方案1】:

这会发生,因为有些物种没有NAs,而另一些则有。如果没有缺失,summary 将没有 NA 列,并且 rbind 不知道如何处理不同数量的列。当没有丢失时,您会看到第一个元素重复(最小)。对于缺少一些的物种,您会看到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))

【讨论】:

  • 太棒了,谢谢!!
猜你喜欢
  • 2012-02-13
  • 2017-12-31
  • 2021-02-05
  • 2021-10-13
  • 2019-07-28
  • 2016-01-02
  • 2012-03-21
相关资源
最近更新 更多