R, используя цикл for, как я могу генерировать новые переменные с разными результатами в соответствии с разными целевыми фреймами данных

#r

#r

Вопрос:

R, используя цикл for, как я могу генерировать новые переменные с разными результатами в соответствии с разными целевыми фреймами данных.

Например, у меня есть фреймы данных с именами Version1, version2, version3, version4, version5, version6.

Подробнее в версиях:

Версия 1:
Имя Возраст HW_score Промежуточный итоговый пол Год_в_школе
AA 21 90 90 90 F 1
AB 20 80 88 100 F 1
AC 22 85 95 97 M 1
AD 21 88 99 96 M 1

Версия 2: Имя Возраст HW_score Промежуточный итоговый пол Год_в_школе
AE 23 90 70 90 F 1
BB 20 84 88 90 M 1
DC 21 85 90 97 M 1
AD 22 88 94 96 M 2

Версия 3:
Имя Возраст HW_score Промежуточный итоговый пол Год_в_школе
AZ 23 90 70 94 F 2
CB 20 89 88 90 M 3
FC 21 78 90 97 F 1
AA 24 89 96 96 M 2

аналогично для версии4,5,6

Если мне нужно выбрать строку, в которой возраст равен 21.

Q1: Как я могу создать переменные с именем result_[имя фрейма данных]: result_version1, result_version2, result_version3, result_version4, result_version5, result_version6. И сохранять результаты каждого фрейма данных в новые переменные.

Желаемые результаты

result_version1:
Имя Возраст HW_score Промежуточный итоговый Пол Год_в_школе
AA 21 90 90 90 F 1
AD 21 88 99 96 M 1

result_version2:
Имя Возраст HW_score Промежуточный итоговый пол Год_в_школе
DC 21 85 90 97 M 1

result_version3:
FC 21 78 90 97 F 1

аналогично для result_version4,5,6

Q2: Что делать, если сохранить результаты из разных фреймов данных в одну переменную:

Желаемый результат:

result_version_all
Имя Возраст HW_score Промежуточный итоговый Пол Год_в_школе
AA 21 90 90 90 F 1
AD 21 88 99 96 M 1
DC 21 85 90 97 M 1
FC 21 78 90 97 F 1

Как следует написать код в R, используя цикл for, чтобы получить вышеуказанный результат? Спасибо!!!

Ответ №1:

Вы можете поместить все фреймы данных в список и подмножество их с помощью lapply .

 result <- lapply(mget(paste0('Version', 1:6)), function(x) subset(x, Age == 21))
 

result имеет список фреймов данных с выводом. Чтобы получить их как отдельные фреймы данных, используйте list2env

 names(result) <- paste0('result_',paste0('Version', 1:6))
list2env(result, .GlobalEnv)
 

Объедините весь список фреймов данных в один результат.

 result_version_all <- do.call(rbind, result)
 

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

1. Спасибо. Это удается. И я хочу знать, что делать, если мне нужно удалить вторую строку для каждого фрейма данных и сохранить ее в результатах. Как, подмножество lapply(mget(paste0(‘Version’, 1: 6)), функция (x)(x, возраст == 21)) следует пересмотреть?

2. И что, если теперь версии с 1 по 6 хранятся в одном фрейме данных с именем version_all . И я хочу разделить их на меньший фрейм данных в соответствии с различными условиями. Например, фрейм данных version_male, если пол = мужской, version_female, если пол = женский, или version_y20, если возраст = 20, version_y21, если возраст = 21, …. (предположим, всего 6 разных возрастов). Можно ли это сделать в одной строке кода lapply? Спасибо!

3. @Sienna97 Пожалуйста, не задавайте свой вопрос в комментариях. Если у вас есть дополнительный вопрос, вы можете добавить его в качестве нового вопроса. Чтобы удалить вторую строку, вы можете сделать result <- lapply(mget(paste0('Version', 1:6)), function(x) subset(x, Age == 21)[-2, ]) Или result <- lapply(mget(paste0('Version', 1:6)), function(x) subset(x[-2, ], Age == 21)) в зависимости от того, как вы хотите получить конечный результат.

4. Извините, я задам расширенный вопрос в качестве нового вопроса. Спасибо за помощь.

Ответ №2:

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

Q1 result_version1 = Version1[which(Version1$Age == 21),] # repeat for all versions

Q2 result_version_all = rbind(result_version1,result_version2,...result_version6)

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

1. Спасибо, это работает. Но если имеется большое количество фреймов данных, например, более 2000. Этот процесс приведет ко многим строкам кода.