基于R中的列名将数据帧拆分为多个数据帧

基于R中的列名将数据帧拆分为多个数据帧,r,R,我有一个包含557列的大型数据帧,我想将其拆分为不同列长度的多个数据帧。我试着在下面解释我想用更小的数据帧实现什么 我的数据帧: > df <- data.frame(row.names = c("x","y","z"), "a" = c(2844.8,10232.5,20150.6), "b" = c(1430.9,29263.6,26334.5), "c" = c(906.2,6

我有一个包含557列的大型数据帧,我想将其拆分为不同列长度的多个数据帧。我试着在下面解释我想用更小的数据帧实现什么

我的数据帧:

> df <- data.frame(row.names = c("x","y","z"),
                 "a" = c(2844.8,10232.5,20150.6),
                 "b" = c(1430.9,29263.6,26334.5),
                 "c" = c(906.2,6019.1,6848.6),
                 "REG01" = c(1871.0,69618.7,45032.2),
                 "d" = c(2106.0,29929.6,58626.1),
                 "e" = c(1818.8,232371.1,42713.6),
                 "REG02" = c(1364.5,57561.7,20656.4),
                 "f" = c(520.4,46754.9,9036.9),
                 "REG03" = c(1821.4,43862.3,51876.1))

> df

        a       b       c   REG01       d        e    REG02        f   REG03
x  2844.8  1430.9   906.2  1871.0  2106.0   1818.8   1364.5    520.4  1821.4
y 10232.5 29263.6  6019.1 69618.7 29929.6 232371.1  57561.7  46754.9 43862.3
z 20150.6 26334.5  6848.6 45032.2 58626.1  42713.6  20656.4   9036.9 51876.1
我真的很难知道从哪里开始,因为结果数据帧的大小不同,要拆分的列的名称也不同,而且鉴于我的实际数据要大得多(我的结果是44个数据帧),我无法显式引用列名称(尽管它们都是start REG,后面有2个数字)

感谢您在base-R中提供的任何建议

lapply(split( as.data.frame(t(df)), cumsum(c(1,grepl("REG",colnames(df))))[1:ncol(df)]),t)
给予

在base-R中

lapply(split( as.data.frame(t(df)), cumsum(c(1,grepl("REG",colnames(df))))[1:ncol(df)]),t)
给予


您可以使用
split.default

split.default(df, c(0, cumsum(grepl("^REG", names(df)[-ncol(df)]))))

$`0`
        a       b      c   REG01
x  2844.8  1430.9  906.2  1871.0
y 10232.5 29263.6 6019.1 69618.7
z 20150.6 26334.5 6848.6 45032.2

$`1`
        d        e   REG02
x  2106.0   1818.8  1364.5
y 29929.6 232371.1 57561.7
z 58626.1  42713.6 20656.4

$`2`
        f   REG03
x   520.4  1821.4
y 46754.9 43862.3
z  9036.9 51876.1

您可以使用
split.default

split.default(df, c(0, cumsum(grepl("^REG", names(df)[-ncol(df)]))))

$`0`
        a       b      c   REG01
x  2844.8  1430.9  906.2  1871.0
y 10232.5 29263.6 6019.1 69618.7
z 20150.6 26334.5 6848.6 45032.2

$`1`
        d        e   REG02
x  2106.0   1818.8  1364.5
y 29929.6 232371.1 57561.7
z 58626.1  42713.6 20656.4

$`2`
        f   REG03
x   520.4  1821.4
y 46754.9 43862.3
z  9036.9 51876.1

请您将数据框(
df
)粘贴到数据框中,以便更容易复制粘贴。感谢(1)使用例如
grep
c
建立列名列表,它应该像
col\u name
一样,其中
col\u name[[1L]
c('a','b','c','REG01')
。希望有一个非常清晰的模式&
col\u名称
可以有点清晰地构造。(2) 使用
df.list=lappy(列名称,函数(cols)df[cols])
。除此之外,我们还需要一个具有代表性的可复制数据子集来进一步提供帮助——正如Valeri提到的,
dput
是您的朋友。请您
dput
数据框(
df
),以便更容易复制粘贴。感谢(1)使用例如
grep
c
建立列名列表,它应该像
col\u name
一样,其中
col\u name[[1L]
c('a','b','c','REG01')
。希望有一个非常清晰的模式&
col\u名称
可以有点清晰地构造。(2) 使用
df.list=lappy(列名称,函数(cols)df[cols])
。除此之外,我们还需要一个具有代表性的可复制数据子集来进一步提供帮助——正如Valeri提到的,
dput
是您的朋友
tmp您能解释一下
拆分的方式吗?默认的
不同于
拆分的
?如果没有双转置
t()
@DanielO,我的答案就无法工作,你说不能让你的答案工作是什么意思<代码>拆分
在拆分时跨行进行。默认值为跨列。如果使用
t
,则将混合数据类型。也就是说,如果有一些字符,那么数字将被强制为字符,我们不希望这样。感谢您的解释,我不知道存在
split.default
,否则我肯定会在我的答案中使用它。这个名字不完全是描述性的。@DanielO不完全是。您仍然可以使用
lappy
。在您的例子中,您可以这样做:
lappy(split(names(df)、cumsum(c(1,grepl(“REG”),colnames(df)))[1:ncol(df)]、function(x)df[x])
。请注意,未使用
t
tmp。您能否解释
拆分的方式。默认值与
拆分不同?如果没有双转置
t()
@DanielO,我的答案就无法工作,你说不能让你的答案工作是什么意思<代码>拆分
在拆分时跨行进行。默认值为跨列。如果使用
t
,则将混合数据类型。也就是说,如果有一些字符,那么数字将被强制为字符,我们不希望这样。感谢您的解释,我不知道存在
split.default
,否则我肯定会在我的答案中使用它。这个名字不完全是描述性的。@DanielO不完全是。您仍然可以使用
lappy
。在您的例子中,您可以这样做:
lappy(split(names(df)、cumsum(c(1,grepl(“REG”),colnames(df)))[1:ncol(df)]、function(x)df[x])
。请注意,未使用
t