【问题标题】:write a loop within dplyr select()在 dplyr select() 中编写一个循环
【发布时间】:2015-12-31 18:13:54
【问题描述】:

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

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

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

这是一个表头的例子:

变量 control1 control1 exper1a exper1a exper1b exper1b

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

我希望代码查找“控制”的第一个整数,然后找到具有相同整数的对应 exper。在对应于 control1 的基本组组中,我想识别第一个 alabbetic 组,并保存结果表。例如:

变量 control1 control1 exper1a exper1a

接下来,我希望代码对所有其他具有 control1 的 exper 组(即 exper1b)重复此功能,并且一旦 control1 的所有 exper 组都用完,移动到 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.
}}

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

提前感谢您的帮助。

【问题讨论】:

  • 将两列命名相同是不好的做法,例如variable control1 control1 exper1 exper1。如果你打电话给df[,"control1"],你(或cpu)怎么知道会出现什么列?
  • 几个cmets:(1)因为我们没有你的CSV,向我们展示你用来读取它的代码是毫无意义的(特别是因为你的问题与读取数据无关。相反,您应该尝试提出您的问题reproducible,在这种情况下,最简单的方法可能是提供模拟数据的代码。(2)您可能想阅读tidy data,您似乎有“组”列,长格式可能比当前的宽格式更好。
  • 并且 (3) 如果您坚持使用可变列而不是转换为长格式并仅使用 group_by,那么您应该从 very nice vignetted on standard and non-standard evaluation in dplyr 开始。
  • Gregor - 假设我转置了表,并打破了当前的列名,这样我的名称中不再存储三个变量,我该如何编写一个循环来帮助我的所有实例的数据分组控制组和实验组放到单独的文件中?
  • 请花点时间在making your question reproducible。它不仅会传达您想要做得更好的东西,还会让您更加认真地思考您的数据。

标签: r for-loop select dplyr


【解决方案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")))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-17
    • 2020-04-25
    • 2011-08-26
    • 2017-01-09
    • 2015-11-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    相关资源
    最近更新 更多