基于列的条件总和在R

时间:2020-06-24 10:52:50

标签: r dplyr

解决一些棘手的问题。我的数据集如下:

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,并且您可以像平常一样进行累加。

输出应如下:

  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

有人有什么想法吗?

4 个答案:

答案 0 :(得分:1)

按行使用唯一的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

答案 1 :(得分:1)

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)

输出

# 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

答案 2 :(得分:1)

它是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))))

答案 3 :(得分:0)

另一个选择是9092中的c_across

dplyr_1.0.0