2014-11-04 72 views
0

我是R中新建的循环用户,希望任何人都可以帮我解决这个问题 我有数据。 20种人口的帧中包含如下如何在R中使用循环

 Sample Population  R    
1 Bari1_062-1  Bari1  94.52303 
2 Bari1_062-2  Bari1  98.27683 
3 Bari1_062-3  Bari1  100.53170 
4 Bari1_062-4  Bari1  96.65940 
5 Bari1_062-5  Bari1  117.62474 
6 Bari1_063-1  Bari1  144.39547 

我需要通过使用R柱[我想通过中的R使用循环以溶解问题] 由于

+1

为什么你想用循环做到这一点?如果'df'是你的数据集,你可以试试'with(df,tapply(R,Population,function(x)c(mean(x),var(x))))''或者'聚合(R〜Population,df,function(x)c(mean(x),var(x)))' – 2014-11-04 18:10:36

+0

它的工作原理非常感谢 – user3792077 2014-11-04 18:18:58

+2

为什么要使用for循环? – 2014-11-04 18:22:48

回答

3

计算每个群体的均值和方差无需编写循环,这里有一些方法

with(df, tapply(R, Population, function(x) c(mean(x), var(x)))) 

或者

aggregate(R ~ Population, df, function(x) c(mean(x), var(x))) 

或者

do.call(rbind, by(df, df$Population, function(x) c(mean(x$R), var(x$R)))) 

或者

do.call(rbind, lapply(split(df, df$Population), function(x) c(mean(x$R), var(x$R)))) 

或者

library(data.table) 
setDT(df)[, list(Var = var(R), Mean = mean(R)), by = Population] 

或者

library(dplyr) 
df %>% 
    group_by(Population) %>% 
    summarise(Var = var(R), Mean = mean(R)) 

如果你坚持要得到一个for循环的解决方案,在这里不用

的预定义的结果数据集(因为它是一个不好的做法,在循环中不断增长的对象)

Res <- data.frame(Population = unique(df$Population), 
        Mean = rep(NA, length(unique(df$Population))), 
        Var = rep(NA, length(unique(df$Population)))) 

运行循环

for(i in unique(df$Population)){ 
    Res$Mean[Res$Population == i] <- mean(df$R[df$Population == i]) 
    Res$Var[Res$Population == i] <- var(df$R[df$Population == i]) 
} 
Res 
# Population  Mean  Var 
# 1  Bari1 108.6685 375.0275