R: объединить имя столбца фрейма данных с номером - PullRequest
0 голосов
/ 08 мая 2018

У меня есть этот простой код, который создает матрицу и фрейм данных:

   mat=matrix(rnorm(40*5), ncol=5)
   df=as.data.frame(mat)
   df2 <- tidyr::gather(df, "x", "y", V1:V5)

Вот голова (df), созданная матом:

           V1          V2          V3          V4          V5
1   0.97111725  0.12937942 -0.89643594 -0.30144874  0.10405400
2   0.68372321 -0.08049954 -0.52891953 -0.56752185 -1.04425728
3   1.04553733  0.24499356  0.25919424 -1.51280159  0.70952009
4   0.16433896 -0.46727565 -0.22030923  1.18732203  0.17529333
5  -1.73732058  0.04977374  1.54042252 -1.27585563 -1.05846972
6   0.35953274  3.09224985 -1.24524965 -0.67492542 -0.68065365

Затем я создаю еще один фрейм данных df2, где собираю значения в два столбца x и y.

df2 <- tidyr::gather(df, "x", "y", V1:V5)

Когда я получаю новые наборы данных, в которых матрица имеет другое количество столбцов, я должен изменить значение столбцов df2 на другое число.

Пример : здесь я использую V5, потому что у меня 5 столбцов: df2 <- tidyr::gather(df, "x", "y", V1:V5), так что теперь Если я получу новую матрицу с 40 столбцами, мне придется вручную изменить ее на V20: df2 <- tidyr::gather(df, "x", "y", V1:V20).

Есть ли способ написать это так: df2 <- tidyr::gather(df, "x", "y", V1:V+ncol(mat)

Ответы [ 3 ]

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

Похоже, вы можете просто передать столбцы в виде символов, таких как:

df3 <- tidyr::gather(df, "x", "y", names(df)[1]:names(df)[5])

Или, как вы конкретно указали в своем примере, чтобы перейти от V1:V+ncol(df), вы можете сделать:

df3 <- tidyr::gather(df, "x", "y", "V1":tail(names(df),1))

А затем сравнивая с вашим результатом:

identical(df2,df3)
#[1] TRUE

Это может быть полезно, поскольку обеспечивает гибкость программного выбора любого диапазона столбцов по сравнению с вариантом, в котором вы исключаете любые столбцы, и автоматически собирает все их.

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

Простой индекс столбца также работает с gather.

Документация gather читает для ... аргументов как:

Выбор столбцов. Если пусто, все переменные выбраны. Вы можете предоставить голые имена переменных, предоставить голые имена переменных, выберите все переменные между x и z с помощью x: z, исключите y с помощью -y. За Дополнительные параметры см. в документации по dplyr :: select ().

mat=matrix(rnorm(40*5), ncol=5)
df=as.data.frame(mat)

df2 <- tidyr::gather(df, "x", "y", 1:5)

#OR
df2 <- tidyr::gather(df, "x", "y", V1:V5)

#OR
df2 <- tidyr::gather(df, "x", "y")  #all columns 


head(df2)
# x          y
# 1 V1 -0.7403657
# 2 V1 -0.7501310
# 3 V1  2.0371748
# 4 V1 -1.2647994
# 5 V1  1.3464162
# 6 V1 -1.8981365

tail(df2)
# x          y
# 195 V5 -2.2739219
# 196 V5 -0.8606414
# 197 V5 -0.8102747
# 198 V5  0.6362617
# 199 V5  0.9962820
# 200 V5  1.6503455
0 голосов
/ 08 мая 2018

Да! Вы можете использовать пасту.

df2 <- tidyr::gather(df, "x" ,"y", V1:paste0("V", ncol(mat)))

Конечно, вы используете все столбцы, поэтому вам не нужно указывать имена. Но в тех случаях, когда вы действительно хотите ссылаться на имена столбцов переменных, я так и поступаю.

В качестве альтернативы, если вы хотите использовать все столбцы, начинающиеся с "V", вы можете сделать

df2 <- tidyr::gather(df, "x", "y", dplyr::starts_with("V"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...