Сумма (не смежных) строк в R - PullRequest
0 голосов
/ 12 мая 2018

извините за этот основной вопрос. Я искал 30 минут, но не нашел ничего подходящего для меня, поэтому рискну спросить!

Представьте себе фрейм данных как таковой

X1 X2 X3 X4
 1 12  4  6
 5  4 11  2
 2 19 21  2

Я хочу получить сумму несмежных строк - 1 и 3, поэтому используйте df вот так;

X1 X2 X3 X4
 1 12  4  6
 5  4 11  2
 2 19 21  2
 3 31 25  8

Как я могу это сделать?

Я перепробовал все (исходный фрейм данных состоит из 19 строк и 66 столбцов);

exampleframe1[20,] <- rbind(exampleframe1[19,] + exampleframe1[16,])
exampleframe1[20,] <- rowsum(exampleframe1[19,], exampleframe1[16,])
exampleframe1[20,] <- exampleframe1[19,] + exampleframe1[16,]

Заранее спасибо!

Ответы [ 3 ]

0 голосов
/ 12 мая 2018

Пример данных:

df <- data.frame(X1 = c(1,5,2), X2 = c(12,4,19), X3 = c(4,11,21), X4 = c(6,2,2))

Индексировать строки и добавить:

df[4,] <- df[1,] + df[3,]

> df
  X1 X2 X3 X4
1  1 12  4  6
2  5  4 11  2
3  2 19 21  2
4  3 31 25  8

desired_rows <- seq(1,3,2) # can be c(1,4,16,17,20,...) with no pattern

> df[desired_rows,] # subset desired rows only
  X1 X2 X3 X4
1  1 12  4  6
3  2 19 21  2

> colSums(df[desired_rows,]) # add desired rows only
 X1 X2 X3 X4 
3 31 25  8

> rbind(df, colSums(df[desired_rows,])) # one-liner to add adjacent rows as desired
  X1 X2 X3 X4
1  1 12  4  6
2  5  4 11  2
3  2 19 21  2
4  3 31 25  8
0 голосов
/ 12 мая 2018

Вы можете использовать подход tidyverse.

требуют (tidyverse)

  df %>% 
    #To get the index of the rows. 
    rownames_to_column("Index") %>%
    #Creating new variable for even and odd rows
    mutate(rowType = ifelse(as.numeric(Index) %% 2 == 0, "even", "odd")) %>% 
    #Delete the index var as we don't need it anymore. 
    select(-Index) %>%
    #Gather and sum by rowType - even/odd row
    gather(Var, value, -rowType) %>% 
    group_by(rowType) %>% 
    summarise(Total = sum(value, na.rm = TRUE))

Результаты:

  rowType Total
  <chr>   <dbl>
1 even      22.
2 odd       67.
0 голосов
/ 12 мая 2018

Как предлагается в комментариях, вы можете просто суммировать нечетные строки следующим образом:

rbind(df, colSums(df[seq(1, nrow(df), 2), ]))

#  X1 X2 X3 X4
#1  1 12  4  6
#2  5  4 11  2
#3  2 19 21  2
#4  3 31 25  8

Пример данных

df <- data.frame(X1 = c(1, 5, 2), X2 = c(12, 4, 19), 
                 X3 = c(4, 11, 21), X4 = c(6, 2, 2))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...