В цикле for, как мне вставить переменную i в кавычку "start_with"? - PullRequest
0 голосов
/ 07 июля 2019

У меня есть этот большой массив данных с видами в строках и выборками в столбцах. Есть 30 образцов, с 12 повторностями каждый. Названия столбцов пишутся так: sample.S1.01; sample.S1.02 ..... sample.S30.11; sample.S30.12.

Я хотел бы создать 30 новых таблиц, содержащих 12 повторов для каждого образца.

У меня есть эта командная строка, которая отлично работает для одного семпла за раз:

dt<- tab_sp_sum %>%
    select(starts_with("sample.S1."))
assign(paste("tab_sp_1"), dt)

Но когда я помещаю это в цикл for, он больше не работает. Я думаю, это связано с тем, что переменная i включена в кавычку start_with, и я не знаю, как ее написать.

for (i in 1:30){
  dt<- tab_sp_sum %>%
    select(starts_with("sample.S",i,".", sep=""))
  assign(paste("tab_sp",i,sep="_"), dt)

, хотя последняя строка работает хорошо, 30 таблиц создаются с правильными именами, но они пусты.

Есть предложения?

Спасибо

Ответы [ 2 ]

2 голосов
/ 07 июля 2019

Мы можем использовать split в base R

nm1 <- paste(c("Sepal", "Petal"), collapse="|")
nm2 <- grep(nm1, names(iris), value = TRUE)
out <- split.default(iris[nm2], sub("\\..*", "", nm2))
head(out[[1]])
#  Petal.Length Petal.Width
#1          1.4         0.2
#2          1.4         0.2
#3          1.3         0.2
#4          1.5         0.2
#5          1.4         0.2
#6          1.7         0.4

head(out[[2]])
#  Sepal.Length Sepal.Width
#1          5.1         3.5
#2          4.9         3.0
#3          4.7         3.2
#4          4.6         3.1
#5          5.0         3.6
#6          5.4         3.9

Или в tidyverse

iris %>%
     select(nm2) %>%
      split.default(str_remove(nm2, "\\..*"))
2 голосов
/ 07 июля 2019

Вместо использования assign и хранения его в разных объектах попробуйте использовать список. Создайте имена, которые вы хотите select, используя paste0, а затем используйте map для создания списка фреймов данных.

library(dplyr)
library(purrr)

df_names <- paste0("sample.S", 1:30, ".")

df1 <- map(df_names, ~tab_sp_sum %>% select(starts_with(.x)))

Затем вы можете использовать df1[[1]], df1[[2]] для доступа к отдельным кадрам данных.


В базе R мы можем использовать lapply, создав регулярное выражение для выбора столбцов, которые начинаются с df_names

df1 <- lapply(df_names, function(x) 
             tab_sp_sum[grep(paste0("^", x), names(tab_sp_sum))])

Использование его со встроенным iris набором данных

df_names <- c("Sepal", "Petal")
df1 <- map(df_names, ~iris %>% select(starts_with(.x)))

head(df1[[1]])
#  Sepal.Length Sepal.Width
#1          5.1         3.5
#2          4.9         3.0
#3          4.7         3.2
#4          4.6         3.1
#5          5.0         3.6
#6          5.4         3.9

 head(df1[[2]])
#  Petal.Length Petal.Width
#1          1.4         0.2
#2          1.4         0.2
#3          1.3         0.2
#4          1.5         0.2
#5          1.4         0.2
#6          1.7         0.4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...