Суммировать и вычитать с помощью NA

#r #count #na #addition #subtraction

#r #подсчитать #na #сложение #вычитание

Вопрос:

кто-нибудь может помочь?

У меня есть набор данных

 x <- data.frame(A = c(NA, '1', '0', '0'),
            B = c('0', '0', '0', NA),
            C = c('1', NA, NA, NA))
  

Мне нужно сгенерировать что-то вроде этого (сгенерировать две переменные x5 и x6):

  _ x1 x2 x3 x4  x5 x6
A  NA 1  0  0   1  2
B  0  0  0  NA  0  3
C  1  NA NA NA  1  0
  

Спасибо

Комментарии:

1. В чем смысл x5 и x6 ? Как вы получаете значения в этих двух столбцах?

2. Это то, что я хочу знать. x5 — это количество единиц, x6 — это количество единиц, которые мне нужны для генерации x5 и x6

Ответ №1:

Я заметил комментарий о том, что вы все еще работаете над этим. Ответ от @ThomasIsCoding работает просто отлично, но на всякий случай, вот альтернативный, пошаговый подход, который вы также можете рассмотреть.

Сначала транспонируйте ваш фрейм данных (мы вызовем df ):

 df <- as.data.frame(t(x))
df

    V1   V2   V3   V4
A <NA>    1    0    0
B    0    0    0 <NA>
C    1 <NA> <NA> <NA>
  

Теперь для 2 дополнительных столбцов используйте rowSums для суммирования значения «1» и «0». Вам нужно na.rm = TRUE заданное присутствие NA в ваших данных. Значение 1:4 представляет первые четыре столбца.

 df$V5 <- rowSums(df[,1:4] == "1", na.rm = T)
df$V6 <- rowSums(df[,1:4] == "0", na.rm = T)
df
  

Вывод

     V1   V2   V3   V4 V5 V6
A <NA>    1    0    0  1  2
B    0    0    0 <NA>  0  3
C    1 <NA> <NA> <NA>  1  0
  

Ответ №2:

Может быть, вы можете попробовать приведенный ниже код

 setNames(
  cbind(
    data.frame(t(x)),
    t(sapply(x, function(v) table(factor(na.omit(v), levels = c(1, 0)))))
  ),
  paste0("x", 1:6)
)
  

что дает

     x1   x2   x3   x4 x5 x6
A <NA>    1    0    0  1  2
B    0    0    0 <NA>  0  3
C    1 <NA> <NA> <NA>  1  0
  

Комментарии:

1. Привет, прошу прощения, я очень новичок в R… Где в кодировке я должен добавить ‘x’? Мой набор данных огромен, поэтому мне нужно будет определить используемые переменные.

2. @Alessa x — это префикс имен столбцов, который добавляется при использовании setNames

3. Я знаю, но я бы вставил первое имя столбцов?

4. Что вы имеете в виду под «вставить первое имя столбцов»? @Alessa

5. Я имею в виду, что в моем примере я бы написал setNames(cbind( test.df(t(x1)), t(sapply(x1, таблица функций (v)(factor(na.omit(v), levels = c(1, 0))))) ), вставка0(«x», 1: 6) )