R循环将输出分配给新向量
R loop assign output to new vector
我在 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 ")
这是我尝试使用 for 循环提取 df
中感兴趣的数据的行名。
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
变量的名称指定为输出向量的名称。
除非您有自己的原因,否则我认为没有必要为此创建 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") 以获得最终输出中所需的列。
我建议不要使用 assign
。相反,我将创建一个命名列表。 See this answer for a long discussion of why lists are better than sequentially named variables。如果您在任何时候决定将列表转换为全局环境中的对象,则可以使用 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"
匹配。您可能会考虑改用正则表达式词边界 "\b1\b"
,因为 "1 "
仍会匹配 "11 foo"
或 "21 bar"
。更好的是,您可以使用 strplit
或类似的方法来创建一个新列,其中仅包含您要匹配的数字键。
我在 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 ")
这是我尝试使用 for 循环提取 df
中感兴趣的数据的行名。
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
变量的名称指定为输出向量的名称。
除非您有自己的原因,否则我认为没有必要为此创建 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") 以获得最终输出中所需的列。
我建议不要使用 assign
。相反,我将创建一个命名列表。 See this answer for a long discussion of why lists are better than sequentially named variables。如果您在任何时候决定将列表转换为全局环境中的对象,则可以使用 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"
匹配。您可能会考虑改用正则表达式词边界 "\b1\b"
,因为 "1 "
仍会匹配 "11 foo"
或 "21 bar"
。更好的是,您可以使用 strplit
或类似的方法来创建一个新列,其中仅包含您要匹配的数字键。