Подстановка отсутствующих значений только для последних последовательных столбцов - PullRequest
0 голосов
/ 02 июля 2019

У меня есть фрейм данных с 10 столбцами, отмеченными 0, 1 или NA.Я хочу заменить NA на 0, но только когда NA являются последовательными в последних столбцах, поэтому мне бы хотелось, чтобы строка была такой: c(1 , 0 , 1, NA, 0, NA , NA , NA, NA, NA)

становится

c(1 , 0, 1, NA, 0, 0 , 0 , 0 , 0 , 0)

Я попробовал это

Nume<-ifelse(rowSums(is.na(Numerica[, 3:10])) != ncol(Numerica[3:10]), Numerica[,3:10] == 0)

Или

if(rowSums(is.na(Numerica[, 3:10])) != ncol(Numerica[3:10])) Numerica[,3:10] == 0

Ответы [ 2 ]

1 голос
/ 02 июля 2019

Вы можете попробовать и этот. Я использовал фрейм данных от Ronak.

library(tidyverse)
library(zoo)
as_tibble(t(df)) %>%  
  mutate_all(~zoo::na.fill(.,  c(NA, NA, 0)))
# A tibble: 10 x 3
     `1`   `2`   `3`
   <int> <int> <int>
 1     1     1     1
 2     0     0     0
 3     1     1     1
 4    NA    NA    NA
 5     0     0     0
 6     0    NA    NA
 7     0    NA    NA
 8     0    NA    NA
 9     0     0     0
10     0     0     1
1 голос
/ 02 июля 2019

Однако могут быть более эффективные способы решения этой проблемы, но здесь используется базовый подход R, использующий apply, который заменяет только последние NA s в строке на 0.

df[] <- t(apply(df, 1, function(x) {
  y <- cumsum(!is.na(x))
  replace(x, max(y) == y & is.na(x), 0)
}))

df
#  V1 V2 V3 V4 V5 V6 V7 V8 V9 V10
#1  1  0  1 NA  0  0  0  0  0   0
#2  1  0  1 NA  0 NA NA NA  0   0
#3  1  0  1 NA  0 NA NA NA  0   1

данные

Создан небольшой поддельный набор данных для работы.

df <- structure(list(V1 = c(1L, 1L, 1L), V2 = c(0L, 0L, 0L), V3 = c(1L, 
1L, 1L), V4 = c(NA, NA, NA), V5 = c(0L, 0L, 0L), V6 = c(NA, NA, 
NA), V7 = c(NA, NA, NA), V8 = c(NA, NA, NA), V9 = c(NA, 0L, 0L
), V10 = c(NA, NA, 1L)), class = "data.frame", row.names = c("1", 
"2", "3"))

df
#  V1 V2 V3 V4 V5 V6 V7 V8 V9 V10
#1  1  0  1 NA  0 NA NA NA NA  NA
#2  1  0  1 NA  0 NA NA NA  0  NA
#3  1  0  1 NA  0 NA NA NA  0   1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...