使用r中的列增量创建for循环

时间:2018-07-14 06:23:01

标签: r for-loop range sequence increment

我大约3周前才开始使用r,我需要帮助。我希望我能解释这个权利。

我有一个数据集,其中4列代表1种刺激的等级。有55个刺激,总计220列。我需要创建一个循环,以4的增量遍历220列,同时完成以下功能:

required_value

我需要列的每一行的总和以及总和的平均值。因此,从本质上讲,我试图以一种简洁的方式实现以下目标:

a<-rowMeans(dataset[1:4], na.rm = TRUE)
data.frame(a)
mean(a, na.rm = TRUE) 

请帮助使我的生活更轻松。我需要一个循环,所以我不必手动执行55次。

先谢谢了,
伊薇特

2 个答案:

答案 0 :(得分:0)

您可以为行平均值创建一个新的数据框,并使用带有波纹管算法的循环:

D <- data.frame(c(1:55),rep(0,55))

for( i in 1:55 )
{
   D[i,2]=Mean(rowMeans(dataset[,i*4-3:i*4],na.rm=TRUE),na.rm=TRUE)
}

Mean(dataset[,2],na.rm=TRUE)

实际上,此代码计算列均值的行均值。

答案 1 :(得分:0)

您不需要for-loop。根据{{​​1}}的列名以及希望显示最终结果的方式,可以有几种选择。

Base-R:一种使用datasetapply的解决方案:

aggregate

选项#2:一种基于colMeans(t(apply(dataset, 1, function(x) aggregate(x, by=list(0:(length(x)-1) %/% 4), mean, na.rm = TRUE)$x)), na.rm = TRUE) #[1] 5.5 15.5 25.5 的解决方案。您需要重命名列以表示tidyverse。然后使用group转换长格式的数据。现在,您可以将基于组的数据汇总为:

gather

数据:

library(tidyverse)
dataset %>% setNames(paste("Group", ((0:(ncol(.)-1)) %/%4)+1, (1:ncol(.)),sep="_")) %>%  
  gather(Group, Value) %>%
  mutate(Group = gsub("_\\d+$","",Group)) %>%
  group_by(Group) %>%
  summarise(Value = mean(Value, na.rm = TRUE))

# # A tibble: 3 x 2
# Group     Value
# <chr>     <dbl>
# 1 Group_1  5.50
# 2 Group_2  15.5 
# 3 Group_3  25.5