Счетчик строк для нескольких столбцов - PullRequest
0 голосов
/ 01 апреля 2020

Привет. Я пытаюсь подсчитать значения для нескольких столбцов из фрейма данных.

date = c('2020-01-01','2020-01-02','2020-01-03','2020-01-04')
a= c(1,NA,1,NA)
b= c(1,0,1,NA)
c = c(NA,NA,0,NA)
df = data.frame(date,a,b,c)

Я попытался с помощью приведенного ниже кода подсчитать количество значений из всех 3 столбцов

df$tot_cnt =  rowSums(df[,c('a','b','c')], na.rm=TRUE)
* 1006. * Я ищу вывод, который будет похож на
tot_cnt = c(2,1,3,NA)
df = data.frame(date,a,b,c,tot_cnt)

Ответы [ 2 ]

1 голос
/ 01 апреля 2020

Не используйте rowSums(). Лучше использовать apply() над строками, указав 1 в качестве поля. Вот код, который должен делать то, что вы просили:

date = c('2020-01-01','2020-01-02','2020-01-03','2020-01-04')
a= c(1,NA,1,NA)
b= c(1,0,1,NA)
c = c(NA,NA,0,NA)
df = data.frame(date,a,b,c)

counts = apply(df[ , 2:4], 1, function(x) sum(!is.na(x)) )
counts[ which( counts == 0 )] = NA_integer_
df$tot_cnt = counts
> df
        date  a  b  c tot_cnt
1 2020-01-01  1  1 NA       2
2 2020-01-02 NA  0 NA       1
3 2020-01-03  1  1  0       3
4 2020-01-04 NA NA NA      NA
0 голосов
/ 01 апреля 2020

Мы можем использовать rowSums для подсчета значений не-NA в каждой строке.

df$tot_cnt <- rowSums(!is.na(df[-1]))
df$tot_cnt
#[1] 2 1 3 0

Если вы хотите заменить 0 на NA, вы можете сделать:

df$total_cnt[df$total_cnt == 0] <- NA
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...