从tribble或rbind清除输出(删除奇数列名称/ ID)

问题描述 投票:0回答:1

目标:我正在尝试创建一个简单的摘要统计表,其中行是相同类型的变量,但来自不同的数据集(并且具有不同的长度)。

问题:当我使用rbind或tribble来组合函数创建的行时,输出是奇数。

1.数据

Age1 <- data.frame(c(5, 10, 15, 20, 25))
colnames(Age1) <- c("Age")
Age2 <- data.frame(c(5, 10, 15))
colnames(Age2) <- c("Age")
Age3 <- data.frame(c(5, 10, 15, 20, 25, 30))
colnames(Age3) <- c("Age")

2.提取摘要统计的功能

我创建了一个函数来提取摘要统计信息(长度,平均值,标准差,最小值,最大值和数据框的名称):

summary.stats <- function(x, d){  
  RowName <- deparse(substitute(d))
  N <- length(x[!is.na(x)])
  Mu <- mean(x)
  Sigma <- sd(x)
  Min <- min(x, na.rm = T)
  Max <- max(x, na.rm = T)
  Row <- cbind(RowName, N, Mu, Sigma, Min, Max)
  print(Row)
}

3A。使用tribble来组合结果

然后,我从每个数据集的函数运行中创建一个三角形。

tribble(
  ~ DF.Name, ~ N, ~ Mean, ~ St.Dev., ~ Min, ~ Max,
  summary.stats(Age1$Age, Age1),
  summary.stats(Age2$Age, Age2),
  summary.stats(Age3$Age, Age3)
)

我收到以下结果:

     RowName N   Mu   Sigma              Min Max 
[1,] "Age1"  "5" "15" "7.90569415042095" "5" "25"
     RowName N   Mu   Sigma Min Max 
[1,] "Age2"  "3" "10" "5"   "5" "15"
     RowName N   Mu     Sigma              Min Max 
[1,] "Age3"  "6" "17.5" "9.35414346693485" "5" "30"

在每行上方,打印列名称。我想摆脱输出中的列名(可能有顶行列名的例外)。

3B。使用rbind组合结果

我可以使用rbind而不是tribble将结果打印在一起:

rbind(
  summary.stats(Age1$Age, Age1),
  summary.stats(Age2$Age, Age2),
  summary.stats(Age3$Age, Age3)
)

但后来我又一次得到一个奇怪的结果:

     RowName N   Mu   Sigma              Min Max 
[1,] "Age1"  "5" "15" "7.90569415042095" "5" "25"
     RowName N   Mu   Sigma Min Max 
[1,] "Age2"  "3" "10" "5"   "5" "15"
     RowName N   Mu     Sigma              Min Max 
[1,] "Age3"  "6" "17.5" "9.35414346693485" "5" "30"
     RowName N   Mu     Sigma              Min Max 
[1,] "Age1"  "5" "15"   "7.90569415042095" "5" "25"
[2,] "Age2"  "3" "10"   "5"                "5" "15"
[3,] "Age3"  "6" "17.5" "9.35414346693485" "5" "30"

任何有关如何清理输出的建议都将非常感谢!谢谢!

r
1个回答
1
投票

这是一个似乎做你想要的解决方案。做出的改变:

  • 从函数内部删除print调用。这是运行rbind时额外打印的原因
  • cbind更改为tibble。这创建了一个数据框,比rbind制作的字符向量更适合dplyr::bind_rows(或cbind)。

这给出了:

summary.stats <- function(x, d){  
  RowName <- deparse(substitute(d))
  N <- length(x[!is.na(x)])
  Mu <- mean(x)
  Sigma <- sd(x)
  Min <- min(x, na.rm = T)
  Max <- max(x, na.rm = T)
  Row <- tibble(RowName, N, Mu, Sigma, Min, Max)
}

rbind(
  summary.stats(Age1$Age, Age1),
  summary.stats(Age2$Age, Age2),
  summary.stats(Age3$Age, Age3)
)
# A tibble: 3 x 6
  RowName     N    Mu Sigma   Min   Max
  <chr>   <int> <dbl> <dbl> <dbl> <dbl>
1 Age1        5  15.0  7.91  5.00  25.0
2 Age2        3  10.0  5.00  5.00  15.0
3 Age3        6  17.5  9.35  5.00  30.0
© www.soinside.com 2019 - 2024. All rights reserved.