[英]Conditional sums based on the columns are duplicated (by row) in R
處理一個棘手的問題。 我的數據集如下:
df <- data.frame("WS_bTIV" = c(5,0,10),"WS_cTIV" = c(0,5,10),"EQ_bTIV"=c(5,10,10),"EQ_cTIV"=c(10,5,10))
> df
WS_bTIV WS_cTIV EQ_bTIV EQ_cTIV
1 5 0 5 10
2 0 5 10 5
3 10 10 10 10
我正在嘗試創建一個總列,它將匯總以“bTIV”結尾的列,無論它們以什么開頭。 但是,數據在某些列中重復。 例如,如果您查看第 1 行:
WS_bTIV 和 EQ_bTIV 列的值都是 5。但是,將它們相加得到 10。但是,我從數據中知道實際的真實總數實際上是 5,並且值 5 已在這些列中重復。 所以在這種情況下,總數實際上應該是 5。
然而,有時(例如在第 2 行)該值可能為 0,您可以照常總結。
output應該如下:
WS_bTIV WS_cTIV EQ_bTIV EQ_cTIV Tot_bTIV Tot_cTIV
1 5 0 5 10 5 10
2 0 5 10 5 10 5
3 10 10 10 10 10 10
有沒有人有任何想法?
按行使用唯一bTIV
和cTIV
值的總和
df$Tot_bTIV <- apply(df[grepl("bTIV$",colnames(df))], 1, function(x) sum(unique(x)))
df$Tot_cTIV <- apply(df[grepl("cTIV$",colnames(df))], 1, function(x) sum(unique(x)))
> df
WS_bTIV WS_cTIV EQ_bTIV EQ_cTIV Tot_bTIV Tot_cTIV
1 5 0 5 10 5 10
2 0 5 10 5 10 5
3 10 10 10 10 10 10
df %>%
mutate(row_id = seq_len(n())) %>%
pivot_longer(
-row_id,
names_to = c(".value", "group"),
names_pattern = "(.*)_(.*)"
) %>%
group_by(row_id, group) %>%
mutate(Tot = if_else(WS == EQ, WS, WS + EQ)) %>%
ungroup() %>%
pivot_wider(
names_from = group,
names_sep = "_",
values_from = c(WS, EQ, Tot)
) %>%
select(-row_id)
OUTPUT
# A tibble: 3 x 6
WS_bTIV WS_cTIV EQ_bTIV EQ_cTIV Tot_bTIV Tot_cTIV
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 5 0 5 10 5 10
2 0 5 10 5 10 5
3 10 10 10 10 10 10
這是 Daniel O 和 det 答案的組合,使用dplyr
:
df %>%
rowwise() %>%
mutate(Tot_bTIV = sum(unique(c(WS_bTIV, EQ_bTIV))) ,
Tot_cTIV = sum(unique(c(WS_cTIV, EQ_cTIV))))
另一個選項是c_across
的dplyr_1.0.0
library(dplyr)
df %>%
rowwise %>%
mutate(Tot_bTIV = sum(unique(c_across(ends_with('bTIV')))),
Tot_cTIV = sum(unique(c_across(ends_with('cTIV')))))
# A tibble: 3 x 6
# Rowwise:
# WS_bTIV WS_cTIV EQ_bTIV EQ_cTIV Tot_bTIV Tot_cTIV
# <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#1 5 0 5 10 5 10
#2 0 5 10 5 10 5
#3 10 10 10 10 10 10
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.