【问题标题】:How can I automate data frame naming in R?如何在 R 中自动命名数据框?
【发布时间】:2013-07-11 12:21:03
【问题描述】:

假设我有以下数据框:

x <- data.frame(let = sample(LETTERS, 100, replace = T),
                num = sample(1:10, 100, replace = T))

我想创建x 的几个子集,其中每个新数据框都以x$let 的级别命名。到目前为止,我已经想出了这个简单的功能:

ss <- function(letra){
  return(subset(x, let == letra))
}

这是非常简陋的,并没有按照我的意愿命名。我的问题是:如何自动执行以下过程?

a <- ss('A')
b <- ss('B')
c <- ss('C')
...
z <- ss('Z')

【问题讨论】:

  • 虽然这当然是可能的,但这不是一个好的做法。您介意将所有子集存储在一个列表中,而不是将每个子集存储在一个单独的变量中吗?
  • 答案可能是“不要”。请改用x &lt;- lapply(LETTERS, ss)
  • ...或者可能只是split(x,x$let)
  • 问题是最后我必须将每个子集作为 XLS 文件通过电子邮件发送给不同的人。将子集存储在列表中是否允许我这样做?
  • 它不仅允许这样做,而且会让它更容易

标签: r function batch-processing subset


【解决方案1】:

稍微详细一点。

xs <- split(x, x$let)

现在我们有一个列表,xs,包含原始数据帧的每个子集。每个列表组件的名称与选择它的因子级别相匹配:

 xs[['D']]
   let num
8    D   8
14   D   1
16   D   9
54   D   5
60   D   6
64   D   8
74   D   8

大多数人使用 xlsxXLConnect 从 R 编写 Excel 文件。我碰巧使用 XLConnect,但解决方案会非常类似。

现在我们可以简单地这样做了:

require(XLConnect)
file_name <- paste0("file",LETTERS,".xlsx")

for (i in seq_len(length(xs))){
    wb <- loadWorkbook(file_name[i],create = TRUE)
    createSheet(wb,"Sheet1")
    writeWorksheet(wb,data = xs[[i]],sheet = 1)
    saveWorkbook(wb)
}

我已经在 for 循环中完成了这项工作,以便更容易阅读和理解,但显然这也可以全部放入 lapplymapply 类型的解决方案中。

【讨论】:

  • 太棒了,谢谢!我承认我不经常使用列表。使用 XLConnect 给我一个错误(“(函数(类,fdef,mtable)中的错误:无法为签名“工作簿”,“data.frame”,“缺失”'”找到函数“writeWorksheet”的继承方法) ,但我认为这与错误的 Java 安装有关。在我与 IT 人员一起解决之前,我将导出为 CSV 并让我的收件人处理它。:D
  • @wleoncio 不是你的错,完全是我的错!我没有完全测试就写了,忘记了createSheet 行,而且你需要在whiteWorksheet 中指定一个工作表。假设您的 Java 安装正常,则编辑后的版本应该可以工作。 (尽管 Java 让人头疼。)
  • 对!现在就像一个魅力。它的运行速度比read.csv 慢,但从长远来看肯定会为我节省很多时间。再次感谢!
【解决方案2】:

同意 Joshua 的观点,你可能想做一些不同的事情,但如果你真的沉迷于你以前的想法,你可以使用:

x <- data.frame(let = sample(LETTERS, 100, replace = T),
            num = sample(1:10, 100, replace = T))

ss <- function(letra){
    assign(letra, subset(x, let == letra), envir = .GlobalEnv)

    # Returning the DF is optional:
    # return(subset(x, let == letra))
}
ss('A')
print(A)

更新:接受Joran的建议,可以写:

x_split <- split(x,x$let)
for (let in x_split) {
  write.csv(let, file = paste0((let$let)[1], ".csv"))
}

【讨论】:

    猜你喜欢
    • 2020-06-13
    • 2021-07-15
    • 1970-01-01
    • 1970-01-01
    • 2015-07-17
    • 2022-11-29
    • 2020-12-26
    • 2021-11-03
    • 1970-01-01
    相关资源
    最近更新 更多