Укажите фрейм данных программно с помощью paste () и замените значение на индекс - PullRequest
0 голосов
/ 24 ноября 2018

Скажем, у меня есть фрейм данных x1:

x1 <- data.frame(Var1 = 1, Var2 = 2, Var3 = 3)

Чтобы отредактировать ячейку, произнесите строку 1 из Var1 Я хотел бы сделать:

> x1 <- data.frame(Var1 = 1, Var2 = 2, Var3 = 3)
> x1
  Var1 Var2 Var3
1    1    2    3
> x1[1,1] <- 10
> x1
  Var1 Var2 Var3
1   10    2    3

Теперь мой вопросКак получить тот же результат, используя paste (), чтобы указать фрейм данных следующим образом: paste0("x", 1).

Я пробовал следующее:

paste0("x", 1)[1,1] <- 10 #obviously won't work

Использование assign(): assign(paste0("x", 1)[1,1], 10)

Использование get(): get(paste0("x", 1))[1,1] <- 10

Использование eval(): eval(parse(paste0("x", 1)))[1,1] <- 10

Все разрешаются с одной и той же ошибкой:

цель назначения расширяется до неязыкового объекта.

Как я могу решить эту проблему без каких-либо обходных путей?

Редактировать:

Как предлагается в комментариях, следующие работы:

y <- get(paste0("x", 1))
y[1,1] <- 10
assign(paste0("x", 1), y)

Но мне было интересно, есть ли прямой способ сделать это, вместо этого обходного пути.

Ответы [ 2 ]

0 голосов
/ 24 ноября 2018

Вы можете использовать функциональную версию [<-.data.frame:

`[<-.data.frame`(get(paste0("x", 1)), 1, 1, 10)
#   Var1 Var2 Var3
# 1   10    2    3

Или использовать универсальную функцию замены и полагаться на правильную диспетчеризацию

`[<-`(get(paste0("x", 1)), 1, 1, 10)

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

0 голосов
/ 24 ноября 2018

Мы можем использовать assign следующим образом:

assign(paste0("x", 1), `[<-` (x1, 1, 1, 10))

x1
#  Var1 Var2 Var3
#1   10    2    3

или

assign(paste0("x", 1), `[<-` (get(paste0("x",1)), 1, 1, 10))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...