Как получить rowSums для выбранных столбцов в R

Я новичок в R и ищу помощь в подсчете сумм выбранного столбца для каждой строки. Мой простой фрейм данных, как показано ниже.

data = data.frame(location = c("a","b","c","d"),
            v1 = c(3,4,3,3), v2 = c(4,56,3,88), v3 =c(7,6,2,9), v4=c(7,6,1,9),
            v5 =c(4,4,7,9), v6 = c(2,8,4,6))

Я хочу сумму столбцов от V1 до V3 и от V4 до V6 для каждой строки в новом фрейме данных.

   x1   x2
a  14   13   
b  66   18
c
d

Я сделал что-то вроде ниже.

rowSums(data[,2:4][,5:7])

Но что-то должно быть не так в моих кодах. Заранее благодарю за любую помощь.

7 ответов

Решение

Вот довольно простое решение с использованием apply,

output <- data.frame( x1 = apply(data[2:4], 1, sum) ,
                      x2 = apply(data[5:7], 1, sum) )

результат:

output
>    x1 x2
> 1  14 13
> 2  66 18
> 3   8 12
> 4 100 24

Мой смысл будет использовать dply:

require(dply)
data %>% mutate(v2v4 = rowSums(.[2:4])) %>% mutate(v4v6 = rowSums(.[5:7])) %>% select(-(location:v6))

результат:

> newDf <- data %>% mutate(v2v4 = rowSums(.[2:4])) %>% mutate(v4v6 = rowSums(.[5:7])) %>% select(-(location:v6))
> newDf
  v2v4 v4v6
1   14   13
2   66   18
3    8   12
4  100   24
rowSums(cbind(mydata$variable1, mydata$variable2, mydata$variable3), na.rm = T )

ОК, если вы хотите отдельный фрейм данных:

> data.frame(X1=rowSums(data[,2:4]), X2=rowSums(data[,5:7]))

Определение двух сумм явно:

cbind(x1=rowSums(data[,c('v1','v2','v3')]),x2=rowSums(data[,c('v4','v5','v6')]));
##       x1 x2
## [1,]  14 13
## [2,]  66 18
## [3,]   8 12
## [4,] 100 24

Мы можем split набор данных в list а затем использовать Reduce с f="+",

sapply(split.default(data[-1], rep(paste0("x", 1:2), each=3)), Reduce, f=`+`)
#     x1 x2
#[1,]  14 13
#[2,]  66 18
#[3,]   8 12
#[4,] 100 24

Вот столкнулся с похожей проблемой

У меня есть один и тот же опрос из 20 вопросов, заданных 2 раза в разное время, поэтому есть 2 разных балла опроса, всего 40 столбцов. Каждый вопрос опроса заканчивается идентификатором. Так, например, первый вопрос опроса отличается добавлением .a или .c:

      Survey1Question1.a
Survey1Question1.c

Допустим, ваши данные находятся в df1, и вы хотите просуммировать все столбцы в каждом опросе, чтобы получить 2 балла опроса:

      df1 %>% mutate(Survey.A = rowSums(.[grepl('\\.a$',colnames(.))]),
        Survey2 = rowSums(.[grepl('\\.c$',colnames(.))]),
        )

# A tibble: 9 x 2
  Survey.A Survey.C
     <dbl>   <dbl>
1       64      51
2       89      91
3       62      60
4       80      80
5       66      69
6       60      61
7       71      74
8       52      50
9       79      69

Я только учусь использовать '.' точечная запись. Но я считаю, что это работает, потому что rowSums ожидает кадр данных. Это означает, что вы можете следовать ответу Technophobe1 выше. Но тогда хитрость заключается в том, как вы можете сделать это программно.

Ну, первый '.' в rowSums — это полный набор столбцов/переменных в наборе данных, передаваемом по каналу (df1). Но вы хотите подмножить это.

Итак, вот где grepl работает хорошо. Вы можете подмножить кадр данных, используя grepl, используя следующий синтаксис: dataframe[,grepl("pattern",colnames(dataframe))]

Итак, в моем коде выше rowSums(.[grepl('\\.a$',colnames(.))])хитрость заключается в замене «dataframe» на «.». точечная запись.

Другие вопросы по тегам