Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
创建一个循环,用于从R中的数据帧计算值?_R_For Loop - Fatal编程技术网

创建一个循环,用于从R中的数据帧计算值?

创建一个循环,用于从R中的数据帧计算值?,r,for-loop,R,For Loop,假设我制作了一个包含6列和10个观察值的虚拟数据帧: X <- data.frame(a=1:10, b=11:20, c=21:30, d=31:40, e=41:50, f=51:60) 然后,我需要从这些值构造一个最终的数据帧。例如,使用上面的虚拟数据帧,它看起来像: value 1. 7.454545 2. 2.84507 我想我需要使用下一个函数在循环中迭代,但是我完全迷路了!感谢您的帮助。您可以通过使用rep创建一个向量,将数据帧拆分为3组,

假设我制作了一个包含6列和10个观察值的虚拟数据帧:

X <- data.frame(a=1:10, b=11:20, c=21:30, d=31:40, e=41:50, f=51:60)
然后,我需要从这些值构造一个最终的数据帧。例如,使用上面的虚拟数据帧,它看起来像:

        value
1.     7.454545
2.     2.84507

我想我需要使用下一个函数在循环中迭代,但是我完全迷路了!感谢您的帮助。

您可以通过使用
rep
创建一个向量,将数据帧拆分为3组,每个元素重复3次。然后,使用此子数据帧列表,应用第二列和第三列求和、相加并除以第一列之和的功能

out_vec <- 
  sapply(
    split.default(X, rep(1:ncol(X), each = 3, length.out = ncol(X)))
    , function(x) (sum(x[2]) + sum(x[3]))/sum(x[1]))

data.frame(value = out_vec)
#      value
# 1 7.454545
# 2 2.845070

通过使用
rep
创建一个向量,每个元素重复3次,可以
将数据帧拆分为3组。然后,使用此子数据帧列表,应用第二列和第三列求和、相加并除以第一列之和的功能

out_vec <- 
  sapply(
    split.default(X, rep(1:ncol(X), each = 3, length.out = ncol(X)))
    , function(x) (sum(x[2]) + sum(x[3]))/sum(x[1]))

data.frame(value = out_vec)
#      value
# 1 7.454545
# 2 2.845070

您可以使用
tapply

tapply(colSums(X), gl(ncol(X)/3, 3), function(x)sum(x[-1])/x[1])
       1        2 
7.454545 2.845070 

您可以使用
tapply

tapply(colSums(X), gl(ncol(X)/3, 3), function(x)sum(x[-1])/x[1])
       1        2 
7.454545 2.845070 

这里有一个带有
tidyverse

library(dplyr) # 1.0.0
library(tidyr)
X %>% 
     summarise(across(.fn = sum)) %>% 
     pivot_longer(everything()) %>% 
     group_by(grp = as.integer(gl(n(), 3, n()))) %>% 
     summarise(value = sum(lead(value)/first(value), na.rm = TRUE)) %>% 
     select(value)
# A tibble: 2 x 1
#  value
#  <dbl>
#1  7.45
#2  2.85
library(dplyr)#1.0.0
图书馆(tidyr)
X%>%
总结(跨越(.fn=sum))%>%
pivot_更长(所有内容())%>%
分组依据(grp=as.integer(gl(n(),3,n())))%>%
总结(价值=总和(领先(价值)/第一(价值),na.rm=真实))%>%
选择(值)
#一个tibble:2x1
#价值观
#  
#1  7.45
#2  2.85

这里有一个带有
tidyverse的选项

library(dplyr) # 1.0.0
library(tidyr)
X %>% 
     summarise(across(.fn = sum)) %>% 
     pivot_longer(everything()) %>% 
     group_by(grp = as.integer(gl(n(), 3, n()))) %>% 
     summarise(value = sum(lead(value)/first(value), na.rm = TRUE)) %>% 
     select(value)
# A tibble: 2 x 1
#  value
#  <dbl>
#1  7.45
#2  2.85
library(dplyr)#1.0.0
图书馆(tidyr)
X%>%
总结(跨越(.fn=sum))%>%
pivot_更长(所有内容())%>%
分组依据(grp=as.integer(gl(n(),3,n())))%>%
总结(价值=总和(领先(价值)/第一(价值),na.rm=真实))%>%
选择(值)
#一个tibble:2x1
#价值观
#  
#1  7.45
#2  2.85

是否重复这些值?例如
sum(b)+sum(c))/sum(a)
然后
sum(d)+sum(c))/sum(a)
或者应该是
sum(d)+sum(c))/sum(b)
Hi Onyanbu,不,这些值不会重复——每3个离散列一次。那么c+b/a,然后e+f/d,等等。你重复这些值吗?例如
sum(b)+sum(c))/sum(a)
然后
sum(d)+sum(c))/sum(a)
或者应该是
sum(d)+sum(c))/sum(b)
Hi Onyanbu,不,这些值不会重复——每3个离散列一次。所以c+b/a,然后e+f/d,依此类推。