簡體   English   中英

基於列的條件和在 R 中重復(按行)

[英]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

有沒有人有任何想法?

按行使用唯一bTIVcTIV值的總和

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_acrossdplyr_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM