根据条件搜索将数据框拆分为多个表

时间:2019-01-10 11:41:50

标签: r split

我有一个像这样的表

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中很好地表达它们?

2 个答案:

答案 0 :(得分: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_colscbind的{​​{1}}上拆分到每个列表。

common_cols

答案 1 :(得分:0)

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

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