R, как использовать цикл for, чтобы каждый элемент в списке выполнялся одной и той же командой

#r

#r

Вопрос:

R, как использовать цикл for, чтобы каждый элемент в списке выполнялся одной и той же командой

например, datanewV_102,datanewV_103,datanewV_105 представляют собой фрейм данных со 100 наблюдениями и 50 столбцами.

Я хочу удалить один и тот же столбец, лучший 6-й столбец, для всех трех фреймов данных

Желаемый результат: (нет нового фрейма данных, отредактируйте существующий фрейм данных.)

datanewV_102,datanewV_103,datanewV_105 становятся фреймами данных со 100 наблюдениями и 49 столбцами.

Мой код был похож:

vlist12 = список (datanewV_102,datanewV_103,datanewV_105)
для (v12 во vlist12) {
v12 = v12[-6]
}

Однако в моем результате datanewV_102,datanewV_103,datanewV_105 остаются неизменными. V12 является копией datanewV_105 и с удалением 6-го столбца.

Как я могу это пересмотреть? если необходимо использовать цикл for?

Ответ №1:

Вам нужно, чтобы ваш вывод также был списком, чтобы иметь возможность хранить все эти отдельные фреймы данных (в вашей текущей версии v12 перезаписывается при каждом появлении цикла).

Это возможно с for помощью цикла, если вы выполняете цикл по индексу. Например:

 datanewV_102 <- data.frame(x = letters[1:10],
                           y = LETTERS[1:10])
datanewV_103 <- data.frame(x = letters[1:10],
                           y = LETTERS[1:10])
datanewV_105 <- data.frame(x = letters[1:10],
                           y = LETTERS[1:10])



datanew_list <- list(datanewV_102,datanewV_103,datanewV_105)

output_list1 <- list()

for(i in seq_along(datanew_list)){
  cur_df <- datanew_list[[i]]
  output_list1[[i]] <- cur_df[-2]
}
 

Но здесь, как правило, случай, когда lapply все становится проще для чтения. Например:

 remove_col <- function(df){
  df[-2]
}

output_list2 <- lapply(datanew_list, remove_col)
 

Два решения эквивалентны:

 all.equal(output_list1, output_list2)
#> [1] TRUE
 

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

1. Он выдает output_list2 в виде списка желаемых данных. Но эти требуемые фреймы данных не сохраняются как datanewV_102, datanewV_103, datanewV_104. Как я должен переназначить его обратно?

2. Вы уверены, что должны? В каждом случае, который я могу придумать, список более практичен (или, что еще лучше, один фрейм данных с дополнительным столбцом, указывающим происхождение). Если вы действительно хотите иметь отдельные переменные, вы всегда можете назначить их вручную как out1 <- out_list[[1]] etc. Одним из способов «обмануть» и получить тот же результат является использование attach() (после присвоения соответствующих имен элементам списка).