簡體   English   中英

R:計算新的變量R代碼

[英]R: Calculating New Variable R Code

我有

            id_1 id_2  name  count total
          1  001  111    a     15  
          2  001  111    b      3   
          3  001  111   sum    28   28
          4  002  111    a      7  
          5  002  111    b     33
          6  002  111   sum    48   48

我希望共享相同id_1和id_2的行共享總數,例如

            id_1 id_2  name   count total
          1  001  111    a     15   28
          2  001  111    b      3   28
          3  001  111   sum    28   28
          4  002  111    a      7   48
          5  002  111    b     33   48
          6  002  111   sum    48   48

我們可以使用來自tidyr fill

library(tidyr)

dat2 <- dat %>% fill(total, .direction = "up")
dat2
#   id_1 id_2 name count total
# 1    1  111    a    15    28
# 2    1  111    b     3    28
# 3    1  111  sum    28    28
# 4    2  111    a     7    48
# 5    2  111    b    33    48
# 6    2  111  sum    48    48

數據

dat <- read.table(text = "            id_1 id_2  name  count total
          1  001  111    a     15   NA
          2  001  111    b      3   NA
          3  001  111   sum    28   28
          4  002  111    a      7   NA
          5  002  111    b     33   NA
          6  002  111   sum    48   48",
                  header = TRUE, stringsAsFactors = FALSE)

考慮基數R的ave計算組maxna.rm來處理NA ):

df$total <- ave(df$total, df$id_1, df$_id_2, FUN=function(i) max(i, na.rm=na.omit))

df
#   id_1 id_2 name count total
# 1    1  111    a    15    28
# 2    1  111    b     3    28
# 3    1  111  sum    28    28
# 4    2  111    a     7    48
# 5    2  111    b    33    48
# 6    2  111  sum    48    48

使用zoodata.table

df <- read.table(text = "id_1 id_2  name  count total
            001  111    a     15  NA
                    001  111    b      3   NA
                    001  111   sum    28   28
                    002  111    a      7  NA
                    002  111    b     33   NA
                    002  111   sum    48   48",
                  header = TRUE, stringsAsFactors = FALSE)# create data
library(zoo)# load packages
library(data.table)
setDT(df)[, total := na.locf(na.locf(total, na.rm=FALSE), na.rm=FALSE, fromLast=TRUE), by = c("id_1", "id_2")]# convert df to data.table and carry forward and backward total by ids

輸出:

    id_1 id_2 name count total
1:    1  111    a    15    28
2:    1  111    b     3    28
3:    1  111  sum    28    28
4:    2  111    a     7    48
5:    2  111    b    33    48
6:    2  111  sum    48    48

使用普通dplyr方式的簡單方法:

dat %>% group_by(id_1, id_2) %>% mutate(total=count[name == "sum"])

或者:

dat %>% group_by(id_1, id_2) %>% mutate(total=na.omit(total)[1])

   id_1  id_2 name  count total
  <int> <int> <chr> <int> <int>
1     1   111 a        15    28
2     1   111 b         3    28
3     1   111 sum      28    28
4     2   111 a         7    48
5     2   111 b        33    48
6     2   111 sum      48    48

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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