Как суммировать количество столбцов с записью в каждой строке? - PullRequest
0 голосов
/ 04 августа 2020

Я хотел бы узнать, сколько столбцов имеет запись в каждой строке:

Например:

Date  A   B
1990  NA  NA
1991  1   NA
1992  2   2
1993  3   3
1994  4   NA
1995  5   3
1996  NA  NA
1997  7   8
1998  8   2
1999  NA  NA
2000  8   4

Столбец C вот результат, который я хочу.

Date  A   B   C
1990  NA  NA  0
1991  1   NA  1
1992  2   2   2
1993  3   3   2
1994  4   NA  1
1995  5   3   2
1996  NA  NA  0
1997  7   8   2
1998  8   2   2
1999  NA  NA  0
2000  8   4   2

Большое спасибо

Ответы [ 4 ]

0 голосов
/ 04 августа 2020

Можете попробовать c_across()

df <- data.frame(obs = 1:5, COL_A = 6:10, COL_B = 11:15, COL_C = c(10, NA, 21, NA, 7))

df2 <-  df %>% 
  rowwise() %>% 
  mutate(TOTAL = sum(c_across(COL_A:COL_C), na.rm = TRUE))

# A tibble: 5 x 5
# Rowwise: 
# obs COL_A COL_B COL_C TOTAL
# <int> <int> <int> <dbl> <dbl>
# 1     1     6    11    10    27
# 2     2     7    12    NA    19
# 3     3     8    13    21    42
# 4     4     9    14    NA    23
# 5     5    10    15     7    32
0 голосов
/ 04 августа 2020

Попробуйте это (вы можете выбрать столбцы в df, здесь я исключил первый столбец):

df$C <- apply(df[,-1],1,function(x) length(which(!is.na(x))))

df
   Date  A  B C
1  1990 NA NA 0
2  1991  1 NA 1
3  1992  2  2 2
4  1993  3  3 2
5  1994  4 NA 1
6  1995  5  3 2
7  1996 NA NA 0
8  1997  7  8 2
9  1998  8  2 2
10 1999 NA NA 0
11 2000  8  4 2

Некоторые данные:

df <- structure(list(Date = 1990:2000, A = c(NA, 1L, 2L, 3L, 4L, 5L, 
NA, 7L, 8L, NA, 8L), B = c(NA, NA, 2L, 3L, NA, 3L, NA, 8L, 2L, 
NA, 4L)), row.names = c(NA, -11L), class = "data.frame")
structure(list(Date = 1990:2000, A = c(NA, 1L, 2L, 3L, 4L, 5L, 
NA, 7L, 8L, NA, 8L), B = c(NA, NA, 2L, 3L, NA, 3L, NA, 8L, 2L, 
NA, 4L)), row.names = c(NA, -11L), class = "data.frame")
0 голосов
/ 04 августа 2020

a tidyverse

library(tidyverse)
df %>% 
  rowwise() %>% 
  mutate(C = sum(!is.na(across(A:B)))) %>% 
  ungroup
# A tibble: 11 x 4
    Date     A     B     C
   <int> <int> <int> <dbl>
 1  1990    NA    NA     0
 2  1991     1    NA     1
 3  1992     2     2     2
 4  1993     3     3     2
 5  1994     4    NA     1
 6  1995     5     3     2
 7  1996    NA    NA     0
 8  1997     7     8     2
 9  1998     8     2     2
10  1999    NA    NA     0
11  2000     8     4     2

Или просто комбинируя mutate с akruns rowSums приближение и удаление столбца ..1

df %>%
  mutate(C = rowSums(!is.na(across(-1)))) 
0 голосов
/ 04 августа 2020

Мы можем использовать rowSums в логическом matrix (созданном с помощью is.na)

df1$C <- rowSums(!is.na(df1[c('A', 'B')])

ПРИМЕЧАНИЕ: здесь сначала добавлен подход rowSums

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...