Применение одной и той же функции к нескольким объектам в R (for-l oop?) - PullRequest
1 голос
/ 08 мая 2020

У меня есть список объектов, содержащих разное количество данных, для которых я хочу глобально выполнить одну и ту же функцию round. Есть ли способ сделать это в одном go, сохраняя объекты отдельно (чтобы каждый объект соответствовал данным, которые он должен содержать), без необходимости go делать это вручную следующим образом?

мой код при попытке вручную выполнить итерацию одной и той же функции для каждого объекта

Спасибо, Кэт ie

Edit1:

> D41
[1] 1.366 1.223 1.223 2.703 1.205 2.053
> d44
[1] 8.929 13.793
> D41r <- round(D41,2)
> d44r <- round(d44,2)
> D41r
[1] 1.37 1.22 1.22 2.70 1.21 2.05
> d44r
[1] 8.93 13.79

Здесь я только что показал два объекта из множества других, каждый с разным количеством данных.

Есть ли способ создать фрейм данных с «разным количеством строк» , или выполнять одну функцию для каждого объекта, перезаписывая себя соответственно?

Ответы [ 3 ]

0 голосов
/ 08 мая 2020

Судя по вашему снимку экрана, похоже, проблема в том, что ваши объекты не находятся в списке, с которым вы можете легко работать, а просто хранятся как значения в вашей глобальной среде (или .GlobalEnv). Вот обходной путь с использованием ls() и getElement:

lapply(ls(), function(x) {
  new_value <- round(getElement(.GlobalEnv, x))
  assign(x, new_value, pos = .GlobalEnv) # re-assign its value to the rounded value
})

ls() перечислит имена значений и объектов (всего) в .GlobalEnv (ваша глобальная среда). Возможно, вам придется использовать grep, чтобы выбрать только те, которые вы хотите, это зависит от того, что еще там есть.

С помощью getElement вы затем можете указать имена объектов в виде символьных строк (именно так ls() вернет их и извлечет их значения, откуда они существуют. Итак, ваш первый аргумент для getElement - это .GlobalEnv, место, где находятся объекты. И второй аргумент - это имя объекта. Если вы затем хотите изменить его значение в глобальной среде, вы можете использовать функцию assign, чтобы существенно перезаписать его, который аналогично позволяет вам указать имя значения в виде символьной строки, а затем .GlobalEnv в качестве аргумента position, если объект просто живет в вашей глобальной среде.

0 голосов
/ 08 мая 2020

Kat ie,

Мы хотим вам помочь, но сложно использовать код, изображенный на изображении. Для вашего следующего сообщения узнайте, как использовать dput.

Поскольку мне не удалось получить вашу структуру данных, я построил похожую:

dfD <- data.frame(D = paste0("D", sample(14:64, 12)),
              Dval = rnorm(12, mean = 20))

R > dfD
     D     Dval
1  D25 20.90942
2  D53 21.51484
3  D59 18.11695
4  D44 20.29304
5  D57 19.51578
6  D22 21.72018
7  D16 20.62322
8  D31 21.97484
9  D18 19.26036
10 D61 22.08744
11 D37 19.36332
12 D55 20.67799

Затем я округлил все Dval до трех цифр:

library(tidyverse)
dfd3 <-  dfD %>% 
 mutate(L3 = round(Dval, digits = 3))

dfd3
R> dfD
     D     Dval     L3
1  D25 20.90942 20.909
2  D53 21.51484 21.515
3  D59 18.11695 18.117
4  D44 20.29304 20.293
5  D57 19.51578 19.516
6  D22 21.72018 21.720
7  D16 20.62322 20.623
8  D31 21.97484 21.975
9  D18 19.26036 19.260
10 D61 22.08744 22.087
11 D37 19.36332 19.363
12 D55 20.67799 20.678

I думаю, это то, что вы ищете. Вы можете уточнить?

Дэвид

0 голосов
/ 08 мая 2020

Раствор Base R:

lapply(obj_list, function(x){if(length(grep("D\\d+", names(x))) > 0){round(x, 3)}else{x}})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...