zell kim
zell kim

Reputation: 69

pick element with condition and sum by row in r data.table

data<-fread(
     V0  V1  V2  V3  V4  V5  V6  V7  V8  V9 V10
 1: 116 116 116 116 102  96  NA 106 116  NA 144
 2: 122 122 114 114 114 114  NA 121 111  98 108
 3: 118  88  78  78  77  72  96  NA  95  NA  NA
 4: 118 118  77  NA  86 139 127  NA 103  93  84
 5: 150 150 154 154 121 121 114 111  NA  NA  NA
 6:  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA 141
 7: 174 174 174 125 118 117 116 139 116 102 104
 8: 183 183 183 175 175 176  NA 139 123 140 141
 9: 134 140 106 174 162 162 169 140 127 112  NA
10: 178 178 178  NA  NA 116  95  95 125 115 103)

I try to sum elements by row with condition(<90) like this

     V0  V1  V2  V3  V4  V5  V6  V7  V8  V9 V10 sum
 1: 116 116 116 116 102  96  NA 106 116  NA 144  0
 2: 122 122 114 114 114 114  NA 121 111  98 108  0
 3: 118  88  78  78  77  72  96  NA  95  NA  NA  88+78+78+77+72
 4: 118 118  77  NA  86 139 127  NA 103  93  84  77+86+84
 5: 150 150 154 154 121 121 114 111  NA  NA  NA  0 
 6:  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA 141  0
 7: 174 174 174 125 118 117 116 139 116 102 104  0 
 8: 183 183 183 175 175 176  NA 139 123 140 141  0
 9: 134 140 106 174 162 162 169 140 127 112  NA  0
10: 178 178 178  NA  NA 116  95  95 125 115 103  0

raw data is large over 10000 row, so I don't prefer for loop please use data.table

Upvotes: 0

Views: 94

Answers (2)

emsinko
emsinko

Reputation: 171

library(dplyr)

df <- data.frame(x=c(1,100,5),y=c(200,5,15), z = c(1,2,NA))
df["sum"] <- df %>% 
               apply(2, function(x) ifelse(x < 90,x,0)) %>% 
               rowSums(na.rm = TRUE)
df

Upvotes: 0

Sven Hohenstein
Sven Hohenstein

Reputation: 81753

Here's a simple way in base R:

data$sum <- rowSums(data * (data < 90), na.rm = TRUE)

In data.table, you can do:

data[ , sum := rowSums(data * (data < 90), na.rm = TRUE)]

     V0  V1  V2  V3  V4  V5  V6  V7  V8  V9 V10 sum
 1: 116 116 116 116 102  96  NA 106 116  NA 144   0
 2: 122 122 114 114 114 114  NA 121 111  98 108   0
 3: 118  88  78  78  77  72  96  NA  95  NA  NA 393
 4: 118 118  77  NA  86 139 127  NA 103  93  84 247
 5: 150 150 154 154 121 121 114 111  NA  NA  NA   0
 6:  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA 141   0
 7: 174 174 174 125 118 117 116 139 116 102 104   0
 8: 183 183 183 175 175 176  NA 139 123 140 141   0
 9: 134 140 106 174 162 162 169 140 127 112  NA   0
10: 178 178 178  NA  NA 116  95  95 125 115 103   0

Upvotes: 4

Related Questions