首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何根据另一个数据文件中的值计算数据中的值

如何根据另一个数据文件中的值计算数据中的值
EN

Stack Overflow用户
提问于 2018-12-05 22:07:20
回答 2查看 63关注 0票数 2

我有一个包含几个不同分析的数据文件,每个分析包含多行数据。我只想从每一个分析中计算出几行的平均数,而这些线在分析中是不同的。其中一个数据包含分析,另一个数据包含每个分析的平均值所需的起始行数和结束行数。下面是一个简单的例子。

分析

代码语言:javascript
复制
df1 <- structure(list(analysis = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L), 
               line = c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L),
               value = c(4.8, 9.8, 7.1, 7.4, 7.4, 3.3, 4.5, 8.7, 3.9, 3.6, 1.9, 9.4, 0.9, 0.6, 2.1, 6.1, 5.3, 4.7, 9.7, 8.6, 8.9, 3.4, 8.7, 7.1)),
          class = "data.frame", row.names = c(NA, -24L))

我想要每个分析的平均值的起始行数和结束行数:

代码语言:javascript
复制
df2 <- structure(list(analysis = 1:3,
               startnum = c(3L, 3L, 2L),
               endnum = c(7L, 6L, 4L)),
          class = "data.frame", row.names = c(NA, -3L))

我设想得到的数据数据将如下所示:

代码语言:javascript
复制
structure(list(analysis=1:3,
               avgval=c(5.94, 3.2, 7.67)),
          class = "data.frame", row.names = c(NA, -3L))

我相信“申请”家庭的答案很简单,但我想不出该怎么做。我可以将数据格式转换为“lapply”的列表,但不确定如何继续下去。

非常感谢,-R

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-12-05 22:47:27

tidyverse中,您可以这样做:

代码语言:javascript
复制
df1 %>%
 left_join(df2, by = c("analysis" = "analysis")) %>% #Merging df1 with df2
 group_by(analysis) %>% #Grouping by "analysis"
 summarise(avgval = mean(value[line >= startnum & line <= endnum])) #Calculating the mean based on given conditions

  analysis avgval
     <int>  <dbl>
1        1   5.94
2        2   3.20
3        3   7.67
票数 0
EN

Stack Overflow用户

发布于 2018-12-05 22:19:58

下面是一种使用data.table的方法

代码语言:javascript
复制
library(data.table)
setDT(df1)
setDT(df2)

line中创建df2列,作为从startnumendnum按组排列的序列。

代码语言:javascript
复制
df2 <- df2[, .(line = seq(startnum, endnum)), by = analysis]

加入两个data.tables并按组进行聚合。

代码语言:javascript
复制
out <- df1[df2, on = c("analysis", "line")]
out <- out[, .(avgval = mean(value)), by = analysis]
out
#   analysis   avgval
#1:        1 5.940000
#2:        2 3.200000
#3:        3 7.666667

如果您想继续使用data.frame,请调用setDF(out)

希望这能有所帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53641492

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档