通过重复字符串拆分数据帧
splitting data frame by repeating strings
我有一个数据框,其中一列将在多行中重复相同的字符串(它会有所不同)。我想根据每个重复名称将数据框拆分为单独的数据框(输出可以是列表)。例如对于这个数据框:
dat = data.frame(names=c('dog','dog','dog','dog','cat','cat'), value=c(1,2,3,4,5,5))
输出应该是
names value
dog 1
dog 2
dog 3
dog 4
和
names value
cat 5
cat 5
我应该提到有成千上万个不同的重复名称。
您可以使用 split
函数,它将在 list
中给出输出。我认为将数据集放在 list
中会更容易,因为大多数操作都可以在列表本身中执行
split(dat, dat$names)
如果您想将 'dog'、'cat'、'dog' 拆分为具有 3 个元素的 'list'(基于@BondedDust 显示的示例) , 一个选项是
indx <- inverse.rle(within.list(rle(as.character(dat$names)),
values <- seq_along(values)))
split(dat, indx)
或者使用data.table
的devel版本,我们可以使用rleid
创建分组变量
library(data.table)#v1.9.5+
setDT(dat)[, grp:= rleid(names)]
然后通过将 'grp' 指定为分组变量,对不同的组使用标准 data.table 操作。
我有一个数据框,其中一列将在多行中重复相同的字符串(它会有所不同)。我想根据每个重复名称将数据框拆分为单独的数据框(输出可以是列表)。例如对于这个数据框:
dat = data.frame(names=c('dog','dog','dog','dog','cat','cat'), value=c(1,2,3,4,5,5))
输出应该是
names value
dog 1
dog 2
dog 3
dog 4
和
names value
cat 5
cat 5
我应该提到有成千上万个不同的重复名称。
您可以使用 split
函数,它将在 list
中给出输出。我认为将数据集放在 list
中会更容易,因为大多数操作都可以在列表本身中执行
split(dat, dat$names)
如果您想将 'dog'、'cat'、'dog' 拆分为具有 3 个元素的 'list'(基于@BondedDust 显示的示例) , 一个选项是
indx <- inverse.rle(within.list(rle(as.character(dat$names)),
values <- seq_along(values)))
split(dat, indx)
或者使用data.table
的devel版本,我们可以使用rleid
创建分组变量
library(data.table)#v1.9.5+
setDT(dat)[, grp:= rleid(names)]
然后通过将 'grp' 指定为分组变量,对不同的组使用标准 data.table 操作。