как зациклить функцию через несколько кадров данных

у меня есть 30 фреймов данных, называемых moonx.cvs. я хотел бы зациклить эту команду квадратного корня и создать новый столбец в каждом кадре данных с именем «B», содержащий значение квадратного корня.

moon1.csv$B <-sqrt(moon1.csv$Ay^2+moon1.csv$Ax^2+moon1.csv$Az^2)
moon2.csv$B <-sqrt(moon2.csv$Ay^2+moon2.csv$Ax^2+moon2.csv$Az^2)

как мне сделать это для всех 30 фреймов данных?

огромное спасибо


person Crabbe1    schedule 11.12.2019    source источник
comment
Наличие множества переменных с индексом в их имени является большим красным флагом, что вы не делаете что-то в стиле R. Жизнь в R становится намного проще, если вы храните связанные данные в (именованных) списках, чтобы вы могли легко применять преобразования к коллекции. Не уверен, как вы оказались с ними в первую очередь, но если вы используете get/assign, я настоятельно рекомендую вам рассмотреть альтернативы.   -  person MrFlick    schedule 11.12.2019
comment
как мне получить новый столбец из списка? я хотел бы сделать следующее: lst1 <- lapply(mget(nm1), transform( CA = B-9.81)) но новый столбец (B) не найден?   -  person Crabbe1    schedule 11.12.2019
comment
Но это не обновляет исходные данные. Это создает новую версию в списке. Таким образом, у вас есть две копии данных, в одной из которых есть дополнительный столбец. Если бы данные изначально были в списке, то вы могли бы легко заменить исходный список новым.   -  person MrFlick    schedule 11.12.2019
comment
извинения - моя плохая формулировка - ваше последнее утверждение - это то, что я хотел бы сделать; создайте другой список, содержащий переменные из первого списка с CA.   -  person Crabbe1    schedule 11.12.2019


Ответы (1)


Мы можем получить наборы данных в list и сделать все это один раз, а результат сохранить в list. Предполагая, что имена объектов "moon1.csv", "moon2.csv", ... "moon30.csv"

nm1 <- sprintf("moon%d.csv", 1:30)
lst1 <- lapply(mget(nm1), transform, B = sqrt(Ay^2 + Ax^2 + Az^2))

Если мы создаем имена столбцов в исходных объектах в глобальной среде (не рекомендуется, так как на каждом этапе это может потребоваться снова)

for(nm in nm1) assign(nm, `[<-`(get(nm), "B", 
         value = with(get(nm), sqrt(Ay^2 + Ax^2 + Az^2))))

Или используя tidyverse

library(purrr)
library(dplyr)
lst1 <- map(get(nm1), mutate, B = sqrt(Ay^2 + Ax^2 + Az^2))
person akrun    schedule 11.12.2019
comment
есть ли способ добавить B в качестве нового столбца в каждый фрейм данных, чтобы все фреймы данных не находились внутри одного списка? - person Crabbe1; 11.12.2019