2017-10-10 22 views
2

我想在R中執行sumif等效操作。在R組中的情況

每當ID和類型匹配並且標誌爲0時,我想計算一個百分比(在下面的例子中,它是(1 /(9 + 30826))否則我想保留它爲0%沒有0標誌)

這裏是例如:

ID Type Flag Value1 Value2 
1 Apple 0  1  9   
1 Apple 1  29312 30826 
1 Orange 1  2222  3423 
2 Orange 1  24566 32234 

我想以下結果:

ID Type Value1 Value2 Result 
1 Apple 29313 30835 0.0032% 
1 Orange 2222 3423 0% 
2 Orange 24566 32234 0% 

回答

1

您可以使用ave()

d <- read.table(header=TRUE, text="ID Type Flag Value1 Value2 
1 Apple 0  1  9   
1 Apple 1  29312 30826 
1 Orange 1  2222  3423 
2 Orange 1  24566 32234") 

d$Result <- ave(ifelse(d$Flag==0, d$Value1, 0), d$ID, d$Type, FUN=sum)/ave(d$Value2, d$ID, d$Type, FUN=sum) 
d$Value1 <- ave(d$Value1, d$ID, d$Type, FUN=sum) 
d$Value2 <- ave(d$Value2, d$ID, d$Type, FUN=sum) 
dResult <- d[d$Flag==1,] 
dResult 
# > dResult 
# ID Type Flag Value1 Value2  Result 
# 2 1 Apple 1 29313 30835 3.243068e-05 
# 3 1 Orange 1 2222 3423 0.000000e+00 
# 4 2 Orange 1 24566 32234 0.000000e+00 

如果在[%]中有$Result,您可以做d$Result <- 100*ave(...)

+0

嘿,謝謝!但是第一行的值2應該是30835! – AB6

1

轉換的data.frame爲 'data.table'(setDT(df1)),按'ID','Type'分組,如果是觀察數大於1,按照OP的帖子所示進行劃分,否則返回0.移除'Flag'列,然後根據'ID'和'Type'得到'Value1'和'Value2'的sum並採取unique

library(data.table) 
setDT(df1)[, Result := if(.N >1) round(100*Value1[1]/(Value2[1]+Value2[2]), 3) 
             else 0, .(ID, Type)] 
df2 <- df1[, -3, with = FALSE] 
df2[, (3:4) := lapply(.SD, sum), .SDcols = Value1:Value2, .(ID, Type)] 
unique(df2) 
# ID Type Value1 Value2 Result 
#1: 1 Apple 29313 30835 0.003 
#2: 1 Orange 2222 3423 0.000 
#3: 2 Orange 24566 32234 0.000 

或者,我們可以在一個單一的流使用tidyverse。由 'ID', '類型' 分組後,創建 '結果' 欄,然後獲得價值」的sumcolumns with mutate_at , remove the 'Flag' and get the distinct`行

library(dplyr) 
df1 %>% 
    group_by(ID, Type) %>% 
    mutate(Result = round(100*if(n()==2) first(Value1)/(first(Value2)+last(Value2)) 
          else 0, 3)) %>% 
    mutate_at(vars(matches('Value')), sum) %>% 
    select(-Flag) %>% 
    distinct 
# A tibble: 3 x 5 
# Groups: ID, Type [3] 
#  ID Type Value1 Value2 Result 
# <int> <chr> <int> <int> <dbl> 
#1  1 Apple 29313 30835 0.003 
#2  1 Orange 2222 3423 0.000 
#3  2 Orange 24566 32234 0.000