我有一个以下格式的数据框(第一行对应某个名称的数字列;数据可能丢失) -
col1.name | col2.name | col3.name | ... 132 | 12.1 | NA | ... 12.4 | NA | 14.6 | ... 13 | 1441 | 535 | ...
对于每一列,我想计算它的均值,中位数和标准差,并将它们添加到格式的数据框中 -
col.name | mean | median | sd col1.name | 123 | 456 | 12.2 col2.name | 12.1 | 45 | 32.1 col3.name | 111 | 14.6 | 69.2 ... | ... | ... | ...
我目前有以下代码;但它给我一个'x'错误必须是数字。我该怎么办呢?
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="cacheSettings" type="Common.Configuration.CacheSettings, Common" restartOnExternalChanges="true" />
</configSections>
</configuration>
答案 0 :(得分:1)
如果您首先重塑长形,例如使用tidyr::gather
,其余的是非常典型的聚合:
library(tidyverse)
df <- data.frame(col1.name = c(132, 12.4, 13),
col2.name = c(12.1, NA, 1441),
col3.name = c(NA, 14.6, 535))
df %>%
gather(col.name, value) %>%
group_by(col.name) %>%
summarise(mean = mean(value, na.rm = TRUE),
median = median(value, na.rm = TRUE),
sd = sd(value, na.rm = TRUE))
#> # A tibble: 3 x 4
#> col.name mean median sd
#> <chr> <dbl> <dbl> <dbl>
#> 1 col1.name 52.5 13.0 68.9
#> 2 col2.name 727. 727. 1010.
#> 3 col3.name 275. 275. 368.
summary
和skimr::skim
也提供类似的摘要。
答案 1 :(得分:0)
首先确保所有列都是数字的:它们似乎可能是,但也许它们不是。如果你sapply(data,class)
,你将得到列的类。或做str(data)
。要解决这个问题:
data=rapply(data,as.numeric,how="replace")
现在您可以将代码应用于数据
答案 2 :(得分:0)
这很有效。
df <- data.frame(col1name = c(132, 12.4, 13), col2name = c(12.1,NA,1441), col3name = c(NA,14.6,535))
new_df <- data.frame(col_name = colnames(df))
for(i in c('mean','median','sd'))
{
new_df[[i]] <- apply(t(df),2,eval(i), na.rm=T)
}
print(new_df)
col_name mean median sd
1 col1name 72.05 72.05 84.782103
2 col2name 13.50 13.50 1.555635
3 col3name 663.00 535.00 722.553804
答案 3 :(得分:0)
使用data.frame d
d <- data.frame(a=1:3, b=4:6, c=c(5,5,5))
你可以做到
t(apply(d, 2, function(i) c(mean=mean(i), median=median(i), sd=sd(i))))
# mean sd sum
#a 2 1 6
#b 5 1 15
#c 5 0 15
如果你有NA
来照顾
t(apply(d, 2, function(i, ...) c(mean=mean(i,...), median=median(i,...), sd=sd(i,...)), na.rm=TRUE))