Изменения в данных через строки, распознаваемые как переменные в R - PullRequest
0 голосов
/ 16 марта 2020

У меня есть переменная x, которая содержит имена переменных для 10 матриц. Поэтому переменная от a до j содержит разные матрицы.

x = letters[seq( from = 1, to = 10 )]
letters[seq( from = 1, to = 10 )]
> [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j"

Я хотел бы изменить имена столбцов на всех этих матрицах. Я использовал функции eval (parse ()) и get (), такие как

>   get(i)[0,] = n 
Error in get(i)[0, ] = n : could not find function "get<-"

>   colnames(eval(parse(text = i))) = n
Error in file(filename, "r") : cannot open the connection
In addition: Warning message:
In file(filename, "r") :
  cannot open file 'a': No such file or directory

, где n содержит имена столбцов, которые я хочу для матрицы, а i - переменная цикла. edit: n - это имя столбца, полученное из первой строки от a до j, которое меняется в каждом l oop.

for (i in x){
   n = get(i)[1,]
   # insert column changing codes
}

Есть ли способ изменить имя столбца из переменной, которая была вызвана из строки другой переменной?

Edit1:

Чтобы уточнить, я пытался выполнить манипулирование данными и моделирование в группе matrices / data frames. В этом случае я специально хотел изменить column name матриц, имя столбца матриц содержится в первой соответствующей матрице, поэтому у каждой матрицы свой набор имен столбцов. Используя другой vector / matrix, содержащий имена этих матриц, я намеревался loop через имена, чтобы обратиться к matrix, а затем специально изменить имя столбца этих матриц.

В ожидании ответов я каким-то образом нашел метод, который, возможно, не самый эффективный и не работает в большинстве сценариев, но кажется мне относительно более простым:

y = get(i)
colnames(y) = n
assign((paste(i)), y)

Это будет циклично от a до j.

Спасибо за комментарии и ответы.

1 Ответ

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

Как упомянул @Maurits Evers, хороший способ решить эту проблему - получить данные в виде списка. Вы можете использовать mget, чтобы получить матрицы в списке и изменить имена столбцов.

list_mat <- lapply(mget(x), function(mat) {colnames(mat) <- n;mat})

Если вы хотите снова изменить измененные матрицы в глобальной среде, вы можете использовать list2env.

list2env(list_mat, .GlobalEnv)

Используя воспроизводимый пример,

a <- matrix(1:16, 4)
colnames(a) <- letters[1:4]
b <- a
n <- letters[9:12]
x <- c('a', 'b')

Использование lapply:

list_mat <- lapply(mget(x), function(mat) {colnames(mat) <- n;mat})
list_mat

#$a
#     i j  k  l
#[1,] 1 5  9 13
#[2,] 2 6 10 14
#[3,] 3 7 11 15
#[4,] 4 8 12 16

#$b
#     i j  k  l
#[1,] 1 5  9 13
#[2,] 2 6 10 14
#[3,] 3 7 11 15
#[4,] 4 8 12 16
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...