假设我有以下数据框:
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')
答案 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"))
}