解决一些棘手的问题。我的数据集如下:
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
有人有什么想法吗?
答案 0 :(得分:1)
按行使用唯一的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
答案 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