1

假设我有以下数据框:

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

2 回答 2

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

大多数人使用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循环中完成了此操作,以便更易于阅读和理解,但显然这也可以全部推入lapplyormapply类型解决方案中。

于 2013-07-12T20:57:16.637 回答
0

同意 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"))
}
于 2013-07-12T20:50:12.587 回答