【问题标题】:How to write a loop in R to create multiple different subsets of data based on column names?如何在 R 中编写循环以根据列名创建多个不同的数据子集?
【发布时间】:2020-03-01 06:46:34
【问题描述】:

我想编写一个循环来从一个大型数据框(总共包含 48 列)创建数据子集,它还可以自动将这些子集写出到 .txt 文件中。我将首先描述我试图在每个文件中实现的结构:

  • 前 9 列应按原样打印到从主文件创建的每个子集中。这些对于创建的所有文件都是必需的。每个子集共有 11 列。
  • 第 10 列和第 11 列将在每个子集中发生变化。循环应该遍历原始数据框中剩余的 39 列,并以所有可能的方式组合它们。因此,如果原始数据集中的列名称是 AA、BB、CC、DD、EE,则子集数据的一些示例组合将是:

(前 9 列)AA BB

(前 9 列)AA CC

(前 9 列)AA DD

(前 9 列)AA EE

  • 文件应根据第 10 列和第 11 列的名称写出。因此,循环创建的文件将是:

AAxBB.txt

AAxCC.txt

AAxDD.txt

AAxEE.txt

我之前曾尝试编写使用列名的循环,但对我来说效果不佳。有关我如何尝试编写代码的示例,请参阅此 previous question。我想知道的是如何潜在地使用列名两次作为变量,以便按照我的意愿写出文件。那可能吗?索引系统会更好吗?非常感谢任何帮助!

这是我目前正在解决的问题:

for (i in colnames(data)){
    for (j in colnames(data){
        subset = subset(data, select = c("1", "2", "3", "4", "5", "6", "7", "8", "9", "print(i)", "print(j)"
        write.table(subsetprint(i)&print("x")&print(j), file ="print(i)&print("x")&print(j)", quote = F, row.names = F, col.names = F, sep = " ", na = "-999")
    }
}

【问题讨论】:

标签: r loops dataframe subset


【解决方案1】:

基本函数combn 是理想的选择。您可以得到所有剩余列名的 2 到 2 个组合,并在每个组合上调用一个函数。

首先,一些数据。

set.seed(1234)
df1 <- matrix(rnorm(5*(4+5)), nrow = 5)
df1 <- as.data.frame(df1)

现在是代码。请注意,我将只保留前 4 列,而不是 9。您应该将函数 fun 参数 DF = df1 的默认值更改为 DF = yourdata

first_cols <- 1:4

fun <- function(nms, DF = df1, fc = first_cols){
  cols <- c(names(DF)[fc], nms)
  outfile <- paste(nms, collapse = 'x')
  outfile <- paste(outfile, 'txt', sep = '.')
  write.table(DF[cols], outfile, 
              row.names = FALSE, col.names = FALSE, 
              quote = FALSE, sep = ' ')
  cols
}
combn(names(df1)[-first_cols], 2, fun)

【讨论】:

    猜你喜欢
    • 2018-01-14
    • 1970-01-01
    • 1970-01-01
    • 2016-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-28
    相关资源
    最近更新 更多