选择条件并在r data.table中逐行求和

时间:2018-11-19 07:39:09

标签: 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)

我尝试像这样用条件(<90)逐行求和

     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

原始数据超过10000行,所以我不喜欢循环 请使用data.table

2 个答案:

答案 0 :(得分:4)

这是基于R的简单方法:

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

data.table中,您可以执行以下操作:

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

答案 1 :(得分:0)

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