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以使其正常工作?感谢。
答案 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的那些列,但所有原始列都保留在“最终”输出+新列中。