我有一个数据框,我想查找每个主题(名称)的值,这将是列的范围之和(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
我有一个庞大的数据集。这只是一个例子。请帮忙!
答案 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])))