Удаление столбцов в одном фрейме данных на основе значений другого - условное зацикливание - PullRequest
0 голосов
/ 14 сентября 2018

Привет, поэтому у меня возникли проблемы с циклическим просмотром моего фрейма данных и удалением столбцов на основе условия подавления = 1. Таким образом, цикл должен был бы пройти через каждый столбец df1 и удалить столбцы suppress = 1 для этой же переменной. Необходимо определить, что конкретная строка suppress = 1 имеет одинаковую переменную в обоих df.

Итак, есть два кадра данных. df1 содержит все данные, а df2 содержит условия, основанные на переменных df1.

df1 <- data.frame("ID" = c(1,2,3,4,5), "Age" = c(19,50,46,32,28))

df2 <- data.frame("Variable" = c("ID", "Age"), "Suppress" = c(1,0))

Основная проблема, с которой я сталкиваюсь, заключается в том, что цикл, который у меня сейчас есть, работает, когда я создаю кадр данных, такой как df1 и df2, но не для того, когда я импортирую файл csv и использую эти данные.

Может ли это быть формат фреймов данных или цикл должен быть настроен для работы с импортом CSV? Я подозреваю, что последнее.

Вот цикл, который у меня сейчас есть:

for(i in names(df1)){
   if(df2$Variable == names(df1[i]) & df2$Suppress == 1){
      df1[i] <- NULL
   }
}

Другая версия ... по сути та же

for(i in names(df1)){
   if(df2$Variable %in% names(df1[i]) & df2$Suppress == 1){
      df1[i] <- NULL
   }
}

Я не могу опубликовать CSV здесь, но я рекомендую попробовать запустить приведенный выше код с импортированным CSV-файлом, похожим на df1 и df2.

Примечание: и df1, и df2 импортируются как csv-файл.

Напомним: почему текущий цикл не работает с импортированными данными CSV и каковы альтернативные способы удаления столбцов на основе переменной подавления df2.

Спасибо

1 Ответ

0 голосов
/ 14 сентября 2018

Я считаю, что логика в размещенном вами коде неверна, вы должны сравнивать каждое значение от df2$Variable до names(df1).

for(i in seq_along(nrow(df2))){
  if(df2$Variable[i] %in% names(df1) && df2$Suppress[i] == 1){
    df1[i] <- NULL
  }
}

df1
#  Age
#1  19
#2  50
#3  46
#4  32
#5  28

Векторизованным способом, без циклов вообще, являетсяследующий.

inx <- (names(df1) %in% df2$Variable) & (df2$Suppress == 1)
df1[!inx]
#  Age
#1  19
#2  50
#3  46
#4  32
#5  28
...