Цикл R назначает выход новому вектору - PullRequest
0 голосов
/ 04 сентября 2018

Я работаю в R, пытаясь сгенерировать несколько различных векторов, используя цикл for.

Сначала я создал небольшой воспроизводимый примерный фрейм данных с именем df.

cluster.assignment <- c("1 Unknown", "1 Unknown", "2 Neuron","3 
PBMC","4 Basket")
Value1 <- c("a","b","c","d","e")
Value2 <- c("191","234","178","929","123")
df <- data.frame(cluster.assignment,Value1,Value2)

DF

  cluster.assignment Value1 Value2
1          1 Unknown      a    191
2          1 Unknown      b    234
3           2 Neuron      c    178
4             3 PBMC      d    929
5           4 Basket      e    123 . 

Далее я создаю переменную с именем clusters, которая включает ключи к интересующим меня наборам данных.

clusters <- c("1 ","4 ")

Вот моя попытка извлечь имена строк данных, представляющих интерес в df, используя цикл for.

for (COI in clusters) { 
  name2 <- c(gsub(" ","", paste("Cluster", COI, sep = "_")))
  assign(Cluster_1, name2, envir = parent.frame())
  name2 <- grep(COI, df$cluster.assignment)
}

Желаемым выходом являются два вектора, называемые Cluster_1 и Cluster_4.

Cluster_1 будет содержать значения 1 и 2

Cluster_4 будет содержать значение 5

Кажется, я не могу понять, как назначить имя переменной COI именем выходного вектора.

Ответы [ 2 ]

0 голосов
/ 04 сентября 2018

Я бы рекомендовал не использовать assign. Вместо этого я создам именованный список. См. Этот ответ для длительного обсуждения того, почему списки лучше, чем последовательно именованные переменные . Если в какой-то момент вы решите преобразовать список в объекты в глобальной среде, вы можете использовать list2env, но это, вероятно, просто сделает больше работы.

## subset the data to the parts we care about, use `split` to separate it
## into a list
subdf = df[grepl(paste(clusters, collapse = "|"), df$cluster.assignment), ]
result = split(subdf, subdf$cluster.assignment, drop = TRUE)
result
# $`1 Unknown`
#   cluster.assignment Value1 Value2
# 1          1 Unknown      a    191
# 2          1 Unknown      b    234
# 
# $`4 Basket`
#   cluster.assignment Value1 Value2
# 5           4 Basket      e    123

## name the list as desired
names(result) = paste("Cluster", trimws(clusters), sep = "_")
result
# $`Cluster_1`
#   cluster.assignment Value1 Value2
# 1          1 Unknown      a    191
# 2          1 Unknown      b    234
# 
# $Cluster_4
#   cluster.assignment Value1 Value2
# 5           4 Basket      e    123

## if only the row names are needed, use lapply
result = lapply(result, row.names)
result
# $`Cluster_1`
# [1] "1" "2"
# 
# $Cluster_4
# [1] "5"

Несколько других примечаний - я предполагаю, что вы включаете пробелы в clusters, чтобы, например, "1" не совпадать с "12 foo". Вместо этого вы можете использовать границу слова regex "\\b1\\b", так как "1 " все равно будет совпадать, скажем, "11 foo" или "21 bar". А еще лучше, вы можете использовать strplit или аналогичный для создания нового столбца только с той цифровой клавишей, которую вы хотите сопоставить.

0 голосов
/ 04 сентября 2018

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

library(data.table)
Cluster_1<-df[df$cluster.assignment %like% "1 ", c("Value1", "Value2")]
Cluster_2<-df[df$cluster.assignment %like% "4 ", c("Value1", "Value2")]
View(Cluster_1);View(Cluster_2)

Вы можете удалить или изменить c («Value1», «Value2»), чтобы получить столбцы, которые вы хотите в конечном выводе.

...