【问题标题】:In a for loop, how do I insert the variable i inside the "starts_with" quotation?在 for 循环中,如何在“starts_with”引号内插入变量 i?
【发布时间】:2019-07-07 13:20:16
【问题描述】:

我有这个大数据框,其中有行中的物种和列中的样本。有 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 个名称正确的表,但它们是空的。

有什么建议吗?

谢谢

【问题讨论】:

  • 您到底想到了什么:starts_with("sample.S",i,".", sep="")?我该怎么办?

标签: r dplyr startswith


【解决方案1】:

不要使用 assign 并将其存储在不同的对象中,而是尝试使用 list 。使用paste0 创建您想要select 的名称,然后使用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

【讨论】:

    【解决方案2】:

    我们可以在base R中使用split

    nm1 <- paste(c("Sepal", "Petal"), collapse="|")
    nm2 <- grep(nm1, names(iris), value = TRUE)
    out <- split.default(iris[nm2], sub("\\..*", "", nm2))
    head(out[[1]])
    #  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
    
    head(out[[2]])
    #  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
    

    或在tidyverse

    iris %>%
         select(nm2) %>%
          split.default(str_remove(nm2, "\\..*"))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多