【问题标题】:split a dataframe to multiple tables based on conditional search根据条件搜索将数据框拆分为多个表
【发布时间】:2019-01-10 11:41:49
【问题描述】:

我有一张这样的桌子:

ID A10 A11 A12 A20 A21 A22 A30 A31 A32
Apple 1 1 1 1 1 1 1 1 1
Banana 2 2 2 2 2 2 2 2 2
Pear 3 3 3 3 3 3 3 3 3

我的第一个问题是,我可以使用 "*" 之类的东西来对多列进行子集化吗?就像如果我想对包含 A2 (A20, A21, A22) 的列进行子集化,我该如何快速完成?

我的第二个问题是如何将此数据框拆分为多个表?我想根据"A1""A2""A3"(与我的第一个问题相关)拆分这个数据框,这将是:

df1<-
ID A10 A11 A12
Apple 1 1 1
Banana 2 2 2
Pear 3 3 3

df2<-
ID A20 A21 A22
Apple 1 1 1
Banana 2 2 2
Pear 3 3 3

df3<-
ID A30 A31 A32
Apple 1 1 1
Banana 2 2 2
Pear 3 3 3

我该怎么做?

对于另一种情况,我有一个列名的字符长度不同的数据框,例如:

ID BSS20 BSS40 BSS60 W01 W02 W03 BW20 BW40 BW60 SS20 SS40 SS60
Apple 1 1 1 1 1 1 1 1 1
Banana 2 2 2 2 2 2 2 2 2
Pear 3 3 3 3 3 3 3 3 3

如何将数据拆分为三个新的数据帧,每个数据帧必须包含W0,例如:

df1<-
ID BSS20 BSS40 BSS60 W01 W02 W03
Apple 1 1 1 1 1 1
Banana 2 2 2 2 2 2
Pear 3 3 3 3 3 3

df2<-
ID BW20 BW40 BW60 W01 W02 W03
Apple 1 1 1 1 1 1
Banana 2 2 2 2 2 2
Pear 3 3 3 3 3 3

df3<-
ID SS20 SS40 SS60 W01 W02 W03
Apple 1 1 1 1 1 1
Banana 2 2 2 2 2 2
Pear 3 3 3 3 3 3

我的专栏是由*20 *40 *60和三个特殊字符W01 W02 W03组成的,如何用r表达好?

【问题讨论】:

    标签: r split


    【解决方案1】:

    是的,您可以使用split.default 将数据框拆分为多个表。在这种情况下,我们可以从列名中提取前两个字符来拆分它们

    split.default(df[-1], substr(names(df)[-1], 1, 2))
    
    #$A1
    #  A10 A11 A12
    #1   1   1   1
    #2   2   2   2
    #3   3   3   3
    
    #$A2
    #  A20 A21 A22
    #1   1   1   1
    #2   2   2   2
    #3   3   3   3
    
    #$A3
    #  A30 A31 A32
    #1   1   1   1
    #2   2   2   2
    #3   3   3   3
    

    如果您想将第一列添加到每个列表中,您可以 cbind 将其添加到每个列表中

    lapply(split.default(df[-1], substr(names(df)[-1], 1, 2)), cbind, df[1])
    

    编辑

    对于更新的数据,我们可以创建两个组,公共列(common_cols)和不同的列(diff_cols

    common_cols <-c("ID", "W01", "W02", "W03")
    diff_cols <- setdiff(names(df), common_cols)
    

    然后只对diff_colscbindcommon_cols 进行拆分到每个列表。

    lapply(split.default(df[diff_cols], substr(names(df[diff_cols]), 1, 2)), 
            cbind, df[common_cols])
    
    #$BS
    #  BSS20 BSS40 BSS60     ID W01 W02 W03
    #1     1     1     1  Apple   1   1   1
    #2     2     2     2 Banana   2   2   2
    #3     3     3     3   Pear   3   3   3
    
    #$BW
    #  BW20 BW40 BW60     ID W01 W02 W03
    #1    1    1    1  Apple   1   1   1
    #2    2    2    2 Banana   2   2   2
    #3    3    3    3   Pear   3   3   3
    
    #$SS
    #  SS20 SS40 SS60     ID W01 W02 W03
    #1    1    1    1  Apple   1   1   1
    #2    2    2    2 Banana   2   2   2
    #3    3    3    3   Pear   3   3   3
    

    【讨论】:

    • 谢谢你的回答,但是如果字符的长度不同怎么办?
    • @leeleelee 我们需要根据您的数据框更改答案。你能用你的实际数据更新你的问题吗?
    • 当然,我会在下面添加
    • 我已经完成了我的问题的编辑,再次感谢您的帮助!
    • @leeleelee 我已经更新了答案。看看它对你的情况是否有帮助。
    【解决方案2】:

    您可以使用以下代码拆分多个数据框。

    df <- read.table(text="ID A10 A11 A12 A20 A21 A22 A30 A31 A32
    Apple 1 1 1 1 1 1 1 1 1
    Banana 2 2 2 2 2 2 2 2 2
    Pear 3 3 3 3 3 3 3 3 3",header = T)
    
    
    df1<-df[ , grepl( "A1" , names(df) ) ]
    df2<-df[ , grepl( "A2" , names(df) ) ]
    df3<-df[ , grepl( "A3" , names(df) ) ]
    

    【讨论】:

    • 感谢您的回答!如果我想 grepl 两个以上的字符怎么办?我试过 'df1
    • 可以在grepl中使用或条件
    猜你喜欢
    • 1970-01-01
    • 2021-04-18
    • 1970-01-01
    • 2020-12-23
    • 2020-10-23
    • 2016-06-24
    • 2020-10-12
    • 1970-01-01
    • 2023-01-10
    相关资源
    最近更新 更多