[英]How do i calculate row sums based on the the row value across partial matched column names in R
我的原始數據有超過 30、000 行和 100 列。這是一個例子:數據集
df <- data.frame(Outcomes= c(3, 4, 5, 6),
ADMDATE_3=c(10,7,9, 7),
ADMDATE_4=c(4,10,6,9),
ADMDATE_5=c(2, 11 ,8,8),
ADMDATE_6=c(4.5,7,9,12))
我的預期結果是我想使用結果列中的值,例如 4 對 ADMDATE 列求和,該列的末尾值為 4 和后續列(mydataset 的剩余長度)。 另一個例子是如果結果 = 5,那么我想要 ADMDate 5 到 6 的總和。
這是我的預期表
Outcomes ADMDATE_3 ADMDATE_4 ADMDATE_5 ADMDATE_6 sum_all
3 10 4 2 4.5 20.5
5 7 10 11 7.0 18.0
6 9 6 8 9.0 9.0
4 7 9 8 12.0 29.0
您可以使用apply
並match
列名和sum
:
apply(df, 1, function(x)
sum(x[match(paste0('ADMDATE_', x[1]),names(x)):length(x)]))
#[1] 20.5 28.0 17.0 12.0
或者使用tidyverse
以長格式獲取數據,保留所有>=
Outcomes
的值並為每個Outcomes
sum
。
library(dplyr)
library(tidyr)
df %>%
pivot_longer(cols = -Outcomes, names_to = c('col','num'), names_sep = "_") %>%
filter(num >= Outcomes) %>%
group_by(Outcomes) %>%
summarise(sum_all = sum(value)) %>%
left_join(df, by = 'Outcomes')
# translator of Outcomes number to column index
outcomes2index <- 1:ncol(df)
names(outcomes2index) <- gsub("ADMDATE_", "", colnames(df))
df$sum_all <- sapply(1:nrow(df), function(i) sum(df[i, outcomes2index[as.character(df$Outcomes[i])]:ncol(df)]))
df
Outcomes ADMDATE_3 ADMDATE_4 ADMDATE_5 ADMDATE_6 sum_all
1 3 10 4 2 4.5 20.5
2 4 7 10 11 7.0 28.0
3 5 9 6 8 9.0 17.0
4 6 7 9 8 12.0 12.0
您給定的df
偏離了您的expected table
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.