在dplyr select()中写一个循环

时间:2015-12-31 18:13:55

标签: r for-loop select dplyr

我开始使用更大的数据集,我需要一种方法来自动化我已经使用过的函数。我希望实现的框架将在dplyr select()中应用一个循环来识别大型数据框中的控制组和相应的实验组,然后执行函数,保存输出,最后重复循环数据集中的所有样本。

数据很复杂,因为我经常处理包含3000多个样本的数据集,因此写出列标题中的每个样本都会破坏使用计算机程序的效率。

数据的布局非常简单。每个对照组标记为“对照”,每个实验组标记为“实验”。为了将每个控件与它的实验组配对,我添加了一个数字组件,使control1对应于exper1,control2对应于exper2等。最后,许多实验组对应同一个控件,所以我添加了一个按字母顺序排列的组件:exper1a和exper1b都对应control1。

以下是表头的示例:

变量control1 control1 exper1a exper1a exper1b exper1b

编辑###请查看Pierre在检查答案中提供的可重复数据###抱歉没有提供我自己的数据。

我希望代码查找“control”的第一个整数,然后找到具有相同整数的相应实体。在对应于control1的实验组中,我想识别第一个麻醉组,并保存结果表。例如:

变量control1 control1 exper1a exper1a

接下来,我希望代码为control1(即exper1b)的所有其他成对实验对象重复此功能,并且一旦所有实验组已经用尽control1,移动到control2 ..,并重复此操作直到没有更多的控制组。

基本上我只想要一堆由一张大桌子制成的小桌子。

到目前为止,这是我拼凑起来的作品:

library(readr)
library(dplyr)
df<-read.csv("big_table.csv")

我知道这很可悲,但它比列出我尝试过的100多次失败尝试更好。这是我想象的理论框架:

# define i as a list of integers without a limit
# define n as a list alpahbetical characters, start at a, stop at z
for(i in 1:ncol(x)) {
    select(df, variable, contains(i))
    for(n in a:ncol(x)){
        selcect(df, variable, contains(n))
write.csv("controli_experin.csv")
# where i in controli is the variable "i", and "in" represents the variables "i" and "n" in experin.
}}

希望这能让每个人都知道我想要做什么。理想情况下,只要列命名法遵循相同的模式,我就可以将此代码应用于大型和小型数据集。

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

这是一个可重复的例子。基本上我们会查找列名中的数字,并将每组数字与第一列组合在一起:

library(stringr)
nums <- as.integer(str_extract(names(df1)[-1], "\\d+"))
lapply(unique(nums), function(x) cbind(df1[1], df1[,c(F,nums == x)]))
# [[1]]
#      variable     ctrl1a     ctrl1b     expr1a      expr1b
# 1 -0.08051177  0.6160930 -0.1509403 -1.1601206  0.84550630
# 2  0.69528553  0.9835623 -0.2764147  0.9141205  1.74502652
# 3 -1.75956316 -0.4281811  0.4065561 -0.4831384 -0.56058428
# 4  0.36156427  1.1100194  1.2543866 -0.7526051  0.50255499
# 5  2.08312138 -0.9252150  1.4087865 -0.5825413 -0.12795336
# 6 -0.35242288  1.0341357  0.3862441  1.0471908 -0.45732123
# 7 -0.45336626  0.3514331 -0.7843920  0.6576382 -1.39281599
# 8  1.34009843 -0.4036598 -0.4233619 -0.1027439  0.04361829
# 9 -0.06922307 -1.6241054  0.6889851  0.9623857 -0.26017311
# 
# [[2]]
#      variable     ctrl2a      ctrl2b     expr2a     expr2b
# 1 -0.08051177 -0.5602536 -0.09769381 -0.5693422  0.5097039
# 2  0.69528553  2.4807524  0.67856805 -0.5307254 -0.8791350
# 3 -1.75956316  0.1682293 -0.05482072  0.1568936 -0.4955552
# 4  0.36156427 -0.2044310  0.80732824 -1.6120776  0.2843847
# 5  2.08312138  0.3807844  0.99740970 -1.6695074 -0.5224782
# 6 -0.35242288 -1.1126282  0.62537929 -0.6152809  1.2340156
# 7 -0.45336626 -2.6516954  1.74563891  0.5517721  1.6779573
# 8  1.34009843 -1.3851439 -0.62581919 -1.1300818 -0.1788827
# 9 -0.06922307 -1.0398341 -0.89502608 -1.1915519  0.3488837

可重复数据

set.seed(1231)
df1 <- data.frame(matrix(rnorm(81), 9,9))
names(df1) <- c("variable", paste0(rep(c("ctrl", "expr"), 2, each=2), rep(1:2, each=4), c("a", "b")))