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

时间:2018-02-12 18:05:27

标签: r

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

问题:当我使用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"

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

1 个答案:

答案 0 :(得分: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