计算R中数据框中每个主题的列值范围

时间:2019-04-24 08:50:16

标签: r dataframe indexing

我有一个数据框,我想查找每个主题(名称)的值,这将是列的范围之和(index1:index2)

names = c('a', 'b', 'c')
index1 = c(5, 6, 4)
index2 = c(7,8,7)
time1 = c(1,1,1)
time2 = c(2,2,2)
time3 = c(3,3,3)
time4 = c(4,4,4)
time5 = c(5,5,5)
df = data.frame(names, index1, index2, time1, time2, time3, time4, time5)

    names index1 index2 time1 time2 time3 time4 time5
1     a      5      7     1     2     3     4     5
2     b      6      8     1     2     3     4     5
3     c      4      7     1     2     3     4     5

输出将是:

ans = 9 12 10

[5:7]的a将为2,3,4 = 9

b的[6:8]将为3,4,5 = 12

[4:7]对于c将为1,2,3,4 = 10

我有一个庞大的数据集。这只是一个例子。请帮忙!

2 个答案:

答案 0 :(得分:1)

使用mapply我们可以做到

mapply(function(x, y, z) sum(df[x, y:z]), seq_len(nrow(df)), df$index1, df$index2)
#[1]  9 12 10

但是,我相信与其对mapply中的数据帧进行子集化,不如对较大的数据集进行分割将更有效。

mapply(function(x, y, z) sum(x[y:z]), 
        split(df, seq_len(nrow(df))), df$index1, df$index2)

一种tidyverse方法可以是首先定义n(非{time列的数量),gather为长格式,group_by每个{{ 1}}并计算names

sum

答案 1 :(得分:0)

替代方法:

apply(df, 1, function(x) sum(as.integer(x[x[["index1"]]:x[["index2"]]])))

另一个:

apply(df[-1], 1, function(x) sum((x[(x[["index1"]]:x[["index2"]]) - 1L])))