Для L oop с индексированными данными - PullRequest
0 голосов
/ 08 марта 2020

вопрос может показаться вам тривиальным, но это действительно доставляет мне неприятности. У меня есть данные в нескольких data.frame (), которые проиндексированы в этом формате: Patient1, Patient2, Patient3, ...

Поэтому я намерен использовать a для l oop, чтобы выполнить те же шаги, чтобы все эти data.frames (), например:

Pat <- c (1:ncol(a))

for (i in Pat) {
  Observedi <- Pati
  Amount <- Drug [Drug$a == i, ]
  i+1
}

Это работает для фильтрации переменной Amount, но не для первой строки. Что мне не хватает? Нужно ли мне использовать i + 1 или R считает автоматически?

С уважением, CG

Отредактировано для уточнения:

Patient1 <- data.frame(1:10, 11:20, 21:30)
Patient2 <- data.frame(1:10, 21:30, 41:50)

nPat <- 1:2

for (i in nPat)
{Observed[i] <- Patient[i]

 }

Я хочу иметь (в этом case) два Observed-data.frames, и они должны иметь тот же индекс, что и Patient-data.frames

Но это не работает, поскольку консоль заявляет, что объект «пациент» не может быть найден. Поэтому я думаю, что он не распознает меня как переменную счетчика, но я не знаю, как это лучше кодировать. Есть ли у вас какие-либо намеки?

С уважением

1 Ответ

0 голосов
/ 08 марта 2020

Проблема в том, как вы используете квадратные скобки, чтобы попытаться сослаться на ваши фреймы данных. Когда вы делаете Patient[1], R интерпретирует это как «первый элемент объекта с именем Patient». Он не осознает, что вам нужен целый объекта с именем Patient1. Аналогично, он не преобразует Pati в Pat1.

. Поэтому в вашем l oop, когда вы делаете Patient[i], R выдает ошибку, потому что нет объекта с именем Patient .

Есть несколько способов решения этой проблемы, но проще всего было бы поместить все ваши фреймы данных в список. Таким образом, вы по-прежнему можете выбирать отдельные кадры данных, вы можете перебирать их и даже объединять их, если хотите.

Если все ваши кадры данных называются Patient1, Patient2, et c ., затем этот код поместит их копии в список с именем Observed:

df_names <- grep("Patient(\\d)+", ls(), value = TRUE)
Observed <- lapply(df_names, get)
names(Observed) <- df_names

Итак, теперь у вас есть список фреймов данных с именем Observed, который выглядит следующим образом:

Observed
#> $Patient1
#>     a  b  c
#> 1   1 11 21
#> 2   2 12 22
#> 3   3 13 23
#> 4   4 14 24
#> 5   5 15 25
#> 6   6 16 26
#> 7   7 17 27
#> 8   8 18 28
#> 9   9 19 29
#> 10 10 20 30
#> 
#> $Patient2
#>     a  b  c
#> 1   1 21 41
#> 2   2 22 42
#> 3   3 23 43
#> 4   4 24 44
#> 5   5 25 45
#> 6   6 26 46
#> 7   7 27 47
#> 8   8 28 48
#> 9   9 29 49
#> 10 10 30 50

Вы можете получить доступ к каждому фрейму данных пациента следующим образом:

Observed$Patient1
#>     a  b  c
#> 1   1 11 21
#> 2   2 12 22
#> 3   3 13 23
#> 4   4 14 24
#> 5   5 15 25
#> 6   6 16 26
#> 7   7 17 27
#> 8   8 18 28
#> 9   9 19 29
#> 10 10 20 30

Если вы хотите объединить их все в один большой фрейм данных, вы можете сделать:

do.call("rbind", Observed)
#>              a  b  c
#> Patient1.1   1 11 21
#> Patient1.2   2 12 22
#> Patient1.3   3 13 23
#> Patient1.4   4 14 24
#> Patient1.5   5 15 25
#> Patient1.6   6 16 26
#> Patient1.7   7 17 27
#> Patient1.8   8 18 28
#> Patient1.9   9 19 29
#> Patient1.10 10 20 30
#> Patient2.1   1 21 41
#> Patient2.2   2 22 42
#> Patient2.3   3 23 43
#> Patient2.4   4 24 44
#> Patient2.5   5 25 45
#> Patient2.6   6 26 46
#> Patient2.7   7 27 47
#> Patient2.8   8 28 48
#> Patient2.9   9 29 49
#> Patient2.10 10 30 50

...