使用mutate对列进行求和

时间:2015-02-25 04:39:34

标签: r

pixel230    pixel231    pixel232    pixel233    pixel234    pixel235...               
61           191         254         254         254        254  ...
0              0          0            0           0        0   ...
0            160         207           6           0        0   ...
23           210         253         253         253       248  ...
0             0           0            8         211       254    ...

我想总结一下cols跳过其中的一些并添加一个新列。 实际上有pixel0到pixel783和600000个。 需要类似的东西:

mutate(df,eureka=sum([pixel230:pixel239]+[pixel244:pixel252])

如何索引df以使其正常工作?感谢。

3 个答案:

答案 0 :(得分:3)

您可以使用select()获取所需的列,然后使用rowSums()进行添加。例如

library(dplyr)

#reproducible example
set.seed(15)
dd <- data.frame(matrix(rpois(7*4,5), ncol=7))

dd %>% select(num_range("X", c(1:2, 5:7))) %>% mutate(eureka=rowSums(.))

这给出了

  X1 X2 X5 X6 X7 eureka
1  5  4  5  7  5     26
2  3 11  9  7  6     36
3  9  7  3  4  2     25
4  6  3  7  2  3     21

要保留所有变量,您可以创建辅助函数

sum_num_range <- function(x, val, rng, name) {
    select(x,num_range(val, rng)) %>% 
        transmute_(.dots=setNames(list(~rowSums(.)), name)) %>% 
        cbind(x,.)
}

dd %>% sum_num_range("X", c(1:2, 5:7), "eureka")

返回

  X1 X2 X3 X4 X5 X6 X7 eureka
1  5  4  6  5  5  7  5     26
2  3 11  7  6  9  7  6     36
3  9  7  2  7  3  4  2     25
4  6  3  6  7  7  2  3     21

或者更一般地说

sum_cols <- function(x, colspec, name) {
    select_(x, .dots=list(lazyeval::lazy(colspec))) %>% 
    transmute_(.dots=setNames(list(~rowSums(.)), name)) %>% 
    cbind(x,.)
}

dd %>% sum_cols(num_range("X", c(1:2, 5:7)), "eureka")

应该与其他select()辅助函数一起使用,例如starts_with()ends_with()everything()等。有关详细信息,请参阅?select帮助页面

答案 1 :(得分:1)

使用data.table的选项。指定获取.SDcols(&#39; nm1&#39;)所需的列(sum),使用Reduce对这些列的相应元素求和,赋值({ {1}})输出到新列(&#39; eureka&#39;)(对于大数据集应该非常快,因为它通过引用添加列)

:=

假设某些列中是否存在缺失值(library(data.table) nm1 <-paste0('pixel', c(230:231, 234:235)) setDT(df)[, eureka:=Reduce(`+`,.SD), .SDcols=nm1][] # pixel230 pixel231 pixel232 pixel233 pixel234 pixel235 eureka #1: 61 191 254 254 254 254 760 #2: 0 0 0 0 0 0 0 #3: 0 160 207 6 0 0 160 #4: 23 210 253 253 253 248 734 #5: 0 0 0 8 211 254 465 ),可以将其替换为&#39; 0&#39;并执行NA

+

使用 df[3,1] <- NA setDT(df)[, eureka := Reduce(`+`, lapply(.SD, function(x) replace(x, which(is.na(x)), 0))), .SDcols=nm1][] 的类似方法是

base R

数据

   df['eureka'] <- Reduce(`+`,lapply(df[nm1], function(x) 
                        replace(x, which(is.na(x)), 0)))

答案 2 :(得分:0)

这是使用rowSums的简单基础R方法:

df$eureka <- rowSums(df[paste0('pixel', c(230:239, 244:252))], na.rm = TRUE)

已修改为包含na.rm = TRUE,因此您还可以对包含NA条目的列进行求和。

paste0('pixel', c(230:239, 244:252))创建要用于计算行总和的列名称的向量。因为您将该向量提供给df[...],所以数据仅被子集化为rowSums的那些列,但所有原始列都保留在“最终”输出+新列中。