Egen rowtotal(Stata)相当于R?

H P*_*ark 2 r stata rstudio

我的数据看起来像这样

bankname    bankid  year    deposit dep_cert capital    surplus
Bank A         1    1881    244789  7250       20218    29513
Bank B         2    1881    195755  10243     185151    NA 
Bank C         3    1881    107736  13357     177612    NA
Bank D         4    1881    170600  NA         20000    NA
Bank E         5    1881    320000  351266    314012    NA
Run Code Online (Sandbox Code Playgroud)

这是复制数据的代码.

bankname <- c("Bank A","Bank B","Bank C","Bank D","Bank E")
bankid <- c( 1, 2,  3,  4,  5)
year<- c( 1881, 1881,   1881,   1881,   1881)
deposit  <- c(244789,    195755, 107736, 170600, 32000000)
dep_cert<-c(7250,10243,13357,NA,351266)
capital<-c(20218,185151,177612,20000,314012)
surplus<-c(29513,NA,NA,NA,NA)
bankdata<-data.frame(bankname, bankid,year,deposit, dep_cert, capital, surplus)
Run Code Online (Sandbox Code Playgroud)

我想创建一个名为新列liability的总和deposit,dep_cert,capital,和surplus.这意味着数据看起来像这样.

bankname    bankid  year    deposit dep_cert capital    surplus liability
Bank A         1    1881    244789  7250       20218    29513   301770 
Bank B         2    1881    195755  10243     185151    NA      391149
Bank C         3    1881    107736  13357     177612    NA      298705
Bank D         4    1881    170600  NA         20000    NA      190600
Bank E         5    1881    320000  351266    314012    NA      32665278
Run Code Online (Sandbox Code Playgroud)

但是,当我sum在R中使用命令时,由于缺少值,我得到了NA.在Stata,我会这样做

egen liability = rowtotal(deposit, dep_cert,capital, surplus)
Run Code Online (Sandbox Code Playgroud)

R中的等效代码是什么?

另外,我的第二个问题是,用数据中的数字0替换所有缺失值(NAs),在Stata中,我会做

foreach x of varlist deposit dep_cert capital surplus {
    replace `x'=0 if missing(`x')
}
Run Code Online (Sandbox Code Playgroud)

R中的等效代码是什么?

A5C*_*2T1 5

相当于rowSums这种情况:

rowSums(bankdata[c("deposit", "dep_cert", "capital", "surplus")], na.rm = TRUE)
# [1]   301770   391149   298705   190600 32665278
Run Code Online (Sandbox Code Playgroud)

你缺少的主要是na.rm = TRUE争论.

要将它添加到您的data.frame,您可以:

bankdata$liability <- rowSums(bankdata[c("deposit", "dep_cert", 
                                         "capital", "surplus")], 
                              na.rm = TRUE)
Run Code Online (Sandbox Code Playgroud)

NA在相同列中替换值为"0",您可以执行以下操作:

## save some typing
cols <- c("deposit", "dep_cert", "capital", "surplus")

bankdata[cols][is.na(bankdata[cols])] <- 0
bankdata
#   bankname bankid year  deposit dep_cert capital surplus
# 1   Bank A      1 1881   244789     7250   20218   29513
# 2   Bank B      2 1881   195755    10243  185151       0
# 3   Bank C      3 1881   107736    13357  177612       0
# 4   Bank D      4 1881   170600        0   20000       0
# 5   Bank E      5 1881 32000000   351266  314012       0
Run Code Online (Sandbox Code Playgroud)