r - R循环将输出分配给新向量
问题描述
我在 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
变量的名称分配为输出向量的名称。
解决方案
我建议不要使用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"
. 您可能会考虑改用正则表达式单词边界"\\b1\\b"
,因为它"1 "
仍然会匹配,比如"11 foo"
or "21 bar"
。更好的是,您可以使用strplit
或类似的方法创建一个仅包含您想要匹配的数字键的新列。
推荐阅读
- python - open() 和 path.open() 的区别
- angular - 如果表数据已更改则显示按钮,如果更改回默认值则隐藏
- html - 如何在启用触摸的情况下将 css 目标写入 Macbook(Retina 显示屏)
- html - 如何使空的div与空间一一保持?
- azure-cosmosdb - 我们可以在 gremlin 的边缘放置和条件吗
- date - 更改 pl/sql 中的变量值
- ruby-on-rails - 如何在rails中组合两个joins.where
- postgresql - 从表中清理文件而不删除 postgresql 9.6.3 中的行
- ios - 如果编程语言发生变化,如何在 iOS 应用商店中更新应用?
- api - 了解单个版本的 GitHub API 响应以查找下载统计信息