r - 在 for 循环中,如何在“starts_with”引号内插入变量 i?
问题描述
我有这个大数据框,行中有物种,列中有样本。有 30 个样本,每个样本 12 个重复。列名是这样写的:sample.S1.01;样品.S1.02.....样品.S30.11;样品.S30.12。
我想创建 30 个新表,其中包含每个样本的 12 个重复。
我有这个命令行,一次可以完美地处理一个样本:
dt<- tab_sp_sum %>%
select(starts_with("sample.S1."))
assign(paste("tab_sp_1"), dt)
但是当我把它放在一个for循环中时,它就不再起作用了。我想是因为变量i包含在starts_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 个表,但它们是空的。
有什么建议吗?
谢谢
解决方案
不要使用assign
并将其存储在不同的对象中,而是尝试使用 list 。创建您要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
推荐阅读
- javascript - 如何检查用户是否仅使用其用户 ID 存在?
- android - 在地图上显示用户位置失败并出现 API 客户端连接错误
- c# - 检查对象参数是否包含字母列表
- c# - 动态加载.dll文件后释放.dll和.pdb
- bash - 如果逐行键入,Shell 脚本可以工作,如果放在文件中则不工作
- css - 移除 Bootstrap 工具提示箭头上方的灰色边框
- sql - SQL 中的计算行
- python - 如何从两个文件夹中读取文件并避免在 Python 中重复
- active-directory - WSO2 身份服务器 5x AD 用户存储 20 个字符限制和 upn
- jquery - 如何从 JQuery each() 中获取元素列表