将摘要数据列表绑定到 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))
我有一个很大的 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))