我有一个像这样的表
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中很好地表达它们?
答案 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_cols
和cbind
的{{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) ) ]