首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R循环将输出赋值给新的向量

R循环将输出赋值给新的向量
EN

Stack Overflow用户
提问于 2018-09-05 02:48:24
回答 2查看 320关注 0票数 0

我在R中工作,试图使用for循环生成几个不同的向量。

首先,我创建了一个名为df的小型可重现示例数据帧。

代码语言:javascript
复制
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

代码语言:javascript
复制
  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的变量,其中包含我感兴趣的数据集的键。

代码语言:javascript
复制
clusters <- c("1 ","4 ")

下面是我使用for循环在df中提取感兴趣数据的行名的尝试。

代码语言:javascript
复制
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_1Cluster_4的向量。

Cluster_1将包含值12

Cluster_4将包含值5

我似乎不知道如何将COI变量的名称指定为输出向量的名称。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-09-05 03:11:23

我建议不要使用assign。相反,我将创建一个命名列表。See this answer for a long discussion of why lists are better than sequentially named variables。如果您在任何时候决定要将列表转换为全局环境中的对象,可以使用list2env,但这样做可能只会做更多工作。

代码语言:javascript
复制
## 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或类似的命令来创建一个新列,其中只包含您想要匹配的数字键。

票数 1
EN

Stack Overflow用户

发布于 2018-09-05 03:04:55

我认为没有必要为此创建一个for循环,除非您有自己的原因,但以下代码可以满足您的需求:

代码语言:javascript
复制
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"),以获得在最终输出中需要的列。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52172341

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档