[英]Conditionally sum a range of columns based on another column in R
我已經查看了其他幾個相關的問題,但還沒有真正找到符合我的情況的東西。
我有一列指示將多少列匯總到一個新列中。
DEPENDENCY == INDEP
那么NET_AGI = IND_AGI
DEPENDENCY == DEP
那么NET_AGI = PRO_AGI + IND_AGI
NET_AGI = PRO_AGI
DEPENDENCY IND_AGI PRO_AGI NET_AGI <- NET_AGI will be the summed column
INDEP 0049995 - 0049995
DEP 0000500 0090500 0091000
DEP 0009000 0121095 0130950
DEP - 0375001 0375001
INDEP 0123456 - 0123456
DEP 0012070 1023030 1035100
...
最好的方法是什么?
可能最快(也是最簡單的)方法之一是
df$NET_AGI = df$PRO_AGI
df[df$DEPENDENCY == 'INDEP', 'NET_AGI'] = df[df$DEPENDENCY == 'INDEP', 'IND_AGI']
df[df$DEPENDENCY == 'DEP', 'NET_AGI'] = rowSums(df[df$DEPENDENCY == 'DEP', c('PRO_AGI', 'IND_AGI')], na.rm = T)
如果您想按原樣讀取數據集並按原樣進行這項工作,請使用以下內容。 請注意,這假定七個字符格式不是必需的。
df <- read.table(text="DEPENDENCY IND_AGI PRO_AGI NET_AGI
INDEP 0049995 - 0049995
DEP 0000500 0090500 0091000
DEP 0009000 0121095 0130950
DEP - 0375001 0375001
INDEP 0123456 - 0123456
DEP 0012070 1023030 1035100",
stringsAsFactors = F, header=T, na.strings = c('NA', '-'))
library(dplyr)
df1 %>%
mutate(NET_AGI_2 = case_when (DEPENDENCY == "DEP" ~ as.character(sprintf('%07d', rowSums(
cbind(as.numeric(IND_AGI),
as.numeric(PRO_AGI)) ,
na.rm = T))),
DEPENDENCY == "INDEP" ~ IND_AGI,
TRUE ~ PRO_AGI))
#> DEPENDENCY IND_AGI PRO_AGI NET_AGI NET_AGI_2
#> 1 INDEP 0049995 - 49995 0049995
#> 2 DEP 0000500 0090500 91000 0091000
#> 3 DEP 0009000 0121095 130950 0130095
#> 4 DEP - 0375001 375001 0375001
#> 5 INDEP 0123456 - 123456 0123456
#> 6 DEP 0012070 1023030 1035100 1035100
read.table(text="DEPENDENCY IND_AGI PRO_AGI NET_AGI
INDEP 0049995 - 0049995
DEP 0000500 0090500 0091000
DEP 0009000 0121095 0130950
DEP - 0375001 0375001
INDEP 0123456 - 0123456
DEP 0012070 1023030 1035100",stringsAsFactors = F, header=T) -> df1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.