根据跨列的行值将data.frame拆分为列表

时间:2015-11-09 11:06:55

标签: r list split dataframe

我想将data.frame拆分为基于data.frame所有列的行值/字符的列表。

我使用write.list {erer}

编写了data.frames列表

所以现在当我再次阅读它们时,它们看起来像这样:

虚拟数据

set.seed(1)
df <- cbind(data.frame(col1=c(sample(LETTERS, 4),"col1",sample(LETTERS, 7))),
            data.frame(col2=c(sample(LETTERS, 4),"col2",sample(LETTERS, 7))),
            data.frame(col3=c(sample(LETTERS, 4),"col3",sample(LETTERS, 7))))
   col1 col2 col3
1     G    E    Q
2     J    R    D
3     N    J    G
4     U    Y    I
5  col1 col2 col3
6     F    M    A
7     W    R    J
8     Y    X    U
9     P    I    H
10    N    Y    K
11    B    T    M
12    E    E    Y

我想通过c("col1","col2","col3")生成

分成列表
[[1]]
       col1 col2 col3
    1     G    E    Q
    2     J    R    D
    3     N    J    G
    4     U    Y    I

[[2]]     
       col1 col2 col3
    1     F    M    A
    2     W    R    J
    3     Y    X    U
    4     P    I    H
    5     N    Y    K
    6     B    T    M
    7     E    E    Y

使用split感觉它应该很简单,但到目前为止我的尝试都失败了。此外,如您所见,我无法按某个行间隔进行拆分。

任何指针都将受到高度赞赏,谢谢!

2 个答案:

答案 0 :(得分:4)

尝试

lapply(split(d1, cumsum(grepl(names(d1)[1], d1$col1))), function(x) x[!grepl(names(d1)[1], x$col1),])
#$`0`
#  col1 col2 col3
#1    G    E    Q
#2    J    R    D
#3    N    J    G
#4    U    Y    I

#$`1`
#   col1 col2 col3
#6     F    M    A
#7     W    R    J
#8     Y    X    U
#9     P    I    H
#10    N    Y    K
#11    B    T    M
#12    E    E    Y

答案 1 :(得分:4)

这应该是一般的,如果你想分开一条线就像app.post('/cropImg',function(req,res){ // get the temporary location of the file var tmp_path = req.files.file_browse_cover.path; gm(tmp_path) .resize(parseInt(req.body.InputWidth), parseInt(req.body.InputHeight), "!") .crop(255, 292, parseInt(req.body.InputLeft), parseInt(req.body.InputTop)) .write(__dirname + "/public/images-esct/cropped/"+req.files.file_browse_cover.name , function (err) { if(err) throw err; console.log(err); }); res.setHeader({file_name: req.files.file_browse_cover.name}); //res.end('please stop'); }) 那样:

colnames

@DavidArenburg在评论中建议,第二行可以写成更多R风格。

dfSplit<-split(df,cumsum(Reduce("&",Map("==",df,colnames(df)))))
for (i in 2:length(dfSplit)) dfSplit[[i]]<-dfSplit[[i]][-1,]

如果dfSplit[-1] <- lapply(dfSplit[-1], function(x) x[-1, ]) 的长度为1(与我原来的第二行相反,会产生错误),它还可以做任何事情。