Замените ячейку на NA в соответствии со значением в другой ячейке в R - PullRequest
0 голосов
/ 15 декабря 2018

У меня есть набор данных, из которого я сделал воспроизводимый пример:

set.seed(1)
Data <- data.frame(
A = sample(0:5),
B = sample(0:5),
C = sample(0:5),
D = sample(0:5),
corr_A.B = sample(0:5),
corr_A.C = sample(0:5),
corr_A.D = sample(0:5))

> Data
  A B C D corr_A.B corr_A.C corr_A.D
1 1 5 4 2        1        2        4
2 5 3 1 3        5        5        0
3 2 2 3 4        0        1        2
4 3 0 5 0        4        0        1
5 0 4 2 1        2        3        3
6 4 1 0 5        3        4        5

И я хотел бы проверить для каждого столбца B, C и D, равна ли одна из их ячеек 0,Я хотел бы заменить в той же строке соответствующий столбец corr_A на NA.Например, поскольку данные $ B [4] равны 0, я бы хотел, чтобы данные $ corr_A.B [4] были заменены на NA.

Я надеюсь получить следующий результат:

> Data
  A B C D corr_A.B corr_A.C corr_A.D
1 1 5 4 2        1        2        4
2 5 3 1 3        5        5        0
3 2 2 3 4        0        1        2
4 3 0 5 0        NA       0       NA
5 0 4 2 1        2        3        3
6 4 1 0 5        3        NA       5

Я пробовал разные способы, используя циклы for, но я изо всех сил.Кроме того, в наборе данных, над которым я работаю, есть много других столбцов, которые не нужно проверять для этого условия, я хотел бы иметь возможность специально указать, в каких столбцах я ищу 0 значений.

Если кто-то будет достаточно любезен, чтобы попробовать?Большое спасибо

Ответы [ 5 ]

0 голосов
/ 15 декабря 2018

Использование apply().Вы могли бы сделать:

cbind(Data,apply(Data[c("B","C","D")],2,function(x){
  ifelse(x==0,NA,x)
}))
0 голосов
/ 15 декабря 2018

Однострочник с использованием функции is.na<-.

is.na(Data[5:7]) <- Data[2:4] == 0

Data
#  A B C D corr_A.B corr_A.C corr_A.D
#1 1 5 4 2        1        2        4
#2 5 3 1 3        5        5        0
#3 2 2 3 4        0        1        2
#4 3 0 5 0       NA        0       NA
#5 0 4 2 1        2        3        3
#6 4 1 0 5        3       NA        5
0 голосов
/ 15 декабря 2018
df<- data.frame(A=c(1,5,2,3,0,4),
                B=c(5,3,2,0,4,1),
                C=c(4,1,3,5,2,0),
                D=c(2,3,4,0,1,5),
                corr_A.B=c(1,5,0,4,2,3),
                corr_A.C=c(2,5,1,0,3,4),
                corr_A.D=c(4,0,2,1,3,5))

df %>% mutate(corr_A.B=case_when(B==0 ~ NA_real_,
                                 TRUE~ corr_A.B),
              corr_A.C=case_when(C==0 ~NA_real_,
                                  TRUE ~ corr_A.C),
              corr_A.D=case_when(D==0 ~ NA_real_,
                                  TRUE ~ corr_A.D))
A B C D corr_A.B corr_A.C corr_A.D
1 1 5 4 2        1        2        4
2 5 3 1 3        5        5        0
3 2 2 3 4        0        1        2
4 3 0 5 0       NA        0       NA
5 0 4 2 1        2        3        3
6 4 1 0 5        3       NA        5
0 голосов
/ 15 декабря 2018

Базовое, однострочное, векторизованное, но извилистое решение:

Data[t(t(which(Data[,2:4]==0,arr.ind=TRUE))+c(0,4))]<-NA
0 голосов
/ 15 декабря 2018

Для базового решения R мы можем просто использовать ifelse здесь:

Data$corr_A.B <- ifelse(Data$B == 0, NA, Data$corr_A.B)
Data$corr_A.C <- ifelse(Data$C == 0, NA, Data$corr_A.C)
Data$corr_A.D <- ifelse(Data$D == 0, NA, Data$corr_A.D)
...