我是使用R的新手,我从我的主管那里得到了这段代码:
for (i in 1:k) mean.mat[i, ] <- mean(data.frame[i])
但是,正如我发现的那样,数据帧的意思不再有效。所以我试着提出以下解决方案:
for (i in 1:k) mean.mat[i, ] <- lapply(norm.df[i], mean, na.rm = TRUE)
但是我收到以下错误消息:
Error in mean.mat[i, ] <- lapply(norm.df[i], mean, na.rm = TRUE) : incorrect number of subscripts on matrix
有人知道为什么这不起作用以及如何替换mean()
函数?
答案 0 :(得分:2)
OP的代码中需要修改几件事。
for
循环
一个。 norm.df[i]
与mean
一起使用不起作用,因为mean
适用于vector
而不是data.frame
。 norm.df[i]
使用data.frame
时,
仍为vector
,并且在其rhs上使用列索引会将其转换为mean
。
湾所有列的vector
都可以连接到vector
。因此,如果我们初始化输出length
,即{mean.norm',其中ncol
等于'norm.df'的mean.norm <- numeric(ncol(norm.df))
,则会更容易
for(i in seq_len(ncol(norm.df))) {
mean.norm[i] <- mean(norm.df[,i], na.rm=TRUE)
}
℃。目前尚不清楚'k'是否定义。如果是,它不是
mean.norm[i]
请注意,使用的索引是mean.norm[i,]
而不是matrix
。对于后者,我们需要将'mean.norm'初始化为lapply
一列。
lapply
使用lapply(norm.df, mean, na.rm=TRUE)
循环列不需要任何索引,除非我们循环遍历列名或列号。
list
以上输出为vector
,但如果我们需要sapply
使用 mean.norm <- sapply(norm.df, mean, na.rm=TRUE)
colMeans(norm.df, na.rm=TRUE)
或者如果我们正在寻找一个紧凑而有效的代码,可以使用 <div id="1">
<div id=2"><button id="button">Click me</button></div>
<div id=3"><iframe src"http://website.com"></iframe> </div>
</div>
(来自@ Roland的评论)
答案 1 :(得分:0)
基于dplyr
的解决方案更符合@Akrun提供的lapply
解决方案:
library(dplyr)
library(tidyr)
dat = data.frame(matrix(runif(100), 10, 10))
dat %>% gather(key, value) %>% group_by(key) %>%
summarise(mn = mean(value), stdev = sd(value))
Source: local data frame [10 x 3]
key mn stdev
(fctr) (dbl) (dbl)
1 X1 0.2817435 0.2795313
2 X2 0.4039304 0.3273860
3 X3 0.4994540 0.2612170
4 X4 0.4302393 0.3548886
5 X5 0.4095109 0.3707861
6 X6 0.4039782 0.2737998
7 X7 0.3985275 0.3672740
8 X8 0.5691146 0.2139044
9 X9 0.5315091 0.2943599
10 X10 0.5471878 0.3904215
我使用gather
将数据集从宽格式转换为长格式:
dat %>% gather(key, value) %>% head(15)
key value
1 X1 0.12273665
2 X1 0.04694209
3 X1 0.06572691
4 X1 0.87899058
5 X1 0.40901575
6 X1 0.63833813
7 X1 0.09088830
8 X1 0.18513657
9 X1 0.10783958
10 X1 0.27182005
11 X2 0.54010596
12 X2 0.03647860
13 X2 0.78629356
14 X2 0.96977616
15 X2 0.54121128