创建一个循环,用于从R中的数据帧计算值?
假设我制作了一个包含6列和10个观察值的虚拟数据帧:创建一个循环,用于从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组,
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,依此类推。