如何在R中自动化数据框命名?

时间:2013-07-12 20:42:19

标签: r function batch-processing subset

假设我有以下数据框:

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')

2 个答案:

答案 0 :(得分:5)

详细说明一下。

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

大多数人使用 xlsx XLConnect 从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循环中完成此操作,以便更易于阅读和理解,但显然这可以全部归入lapply或{{1} }类型解决方案。

答案 1 :(得分:0)

同意约书亚你可能想要做一些不同的事情,但如果你真的迷上了你以前的想法,你可以使用:

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"))
}