На основе условия в столбце во фрейме данных удалите данные в других столбцах той же строки - PullRequest
1 голос
/ 22 января 2020

Интересно, как удалить все данные из всех остальных столбцов подряд, когда trt = C. Меня интересует решение, которое бы работало для множества столбцов!

A <- sample(1:100,9)
B <- sample(1:100,9)
trt <- rep(c("A", "B", "C"),3) 

df <- data.frame(trt, A, B)
df

    trt A  B
1   A  32 43
2   B  29 79
3   C  94 95
4   A 100 24
5   B  63 38
6   C  80 92
7   A  22 98
8   B  61 56
9   C  69 81


to look like this:
       trt A  B
    1   A 90  50
    2   B 84 100
    3   C NA  NA
    4   A 42  17
    5   B 61  43
    6   C NA  NA
    7   A 78  84
    8   B 27  36
    9   C NA  NA

Что-то вроде ...

if(df$trt=="C") {
  df[,i] <- NA
}

Ответы [ 3 ]

2 голосов
/ 22 января 2020

Мы можем использовать [, чтобы выбрать строки и столбцы для изменения, т.е.

df[df$trt == 'C', -1] <- NA

, что дает,

  trt  A  B
1   A 87 56
2   B 53 18
3   C NA NA
4   A  8  1
5   B 79 38
6   C NA NA
7   A 48 36
8   B 55 22
9   C NA NA

Вы также можете использовать это выбрать определенные c столбцы,

df[df$trt == 'C', -c(1, 3)] <- NA

, что дает,

  trt  A  B
1   A 96 27
2   B 21 13
3   C NA 34
4   A 43 98
5   B 70 93
6   C NA 64
7   A  2 60
8   B 40 94
9   C NA 11
1 голос
/ 22 января 2020
    for (i in 1:nrow(df)) {
      if (df$trt[i] == "C") {
        df[i, ] <- NA
        df$trt[i] <- "C"
      }
    }

Хаки, но работает!

1 голос
/ 22 января 2020

Вот решение с функцией is.na<-.

df[-1] <- lapply(df[-1], `is.na<-`, df$trt == "C")
df
#  trt  A  B
#1   A 28 90
#2   B 80 70
#3   C NA NA
#4   A  9 78
#5   B  5 14
#6   C NA NA
#7   A 16 62
#8   B  4  4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...